문제

MVC 컨트롤러에 게시해야 하는 매우 복잡한 양식이 있습니다.

다음은 처음 생성 시 뷰에 전달하는 뷰 모델입니다.

public class EditViewModel
{
    public Service service { get; set; }
    public bool sms { get; set; }
    public bool email { get; set; }
    public string userId { get; set; }
}

내 보기는 다음과 같습니다(간체).

@model IList<Service_Monitor_Web_Interface.Models.ViewModels.EditViewModel>
@{
  ViewBag.Title = "Configure User Notifications";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm("Edit", "Users", FormMethod.Post, new { @class = "stdform stdform2", role = "form" }))
{
@Html.AntiForgeryToken()
<hr />

<p>
    <label><u> Service:</u> </label>
    <span class="field">
        <u>Notification Methods:</u>
    </span>
</p>


for (int i = 0; i < Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}
<br clear="all" /><br />

<p class="stdformbutton">
    <button class="submit radius2">Save</button>
    <input type="reset" class="reset radius2" value="Reset Form" />
</p>
}

내 컨트롤러의 작업 메서드는 다음과 같습니다.

    //
    // POST: /Users/Edit
    [HttpPost]
    public ActionResult Edit(IList<EditViewModel> viewModel)
    {
        return View(viewModel);
    }

컨트롤러에서 뷰 모델을 수신할 때 어떻게 바인딩할 수 있나요?현재 작업 메서드를 디버그하면 다음과 같은 ViewModel이 수신됩니다.

enter image description here

서비스와 userId가 null이 되지 않도록 하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

도우미의 람다에서 다음과 같이 말하세요. model => service.sms 오른쪽 부분(service.sms)는 공식적으로 왼쪽 부분(model).그로 인해 모든 name 결과 입력의 속성이 동일해지며 예상하지 못한 요청 매개변수를 제공합니다.

표준 관행은 다음과 같습니다. for 대신 foreach 루프의 경우.이렇게 하면 결과 HTML의 이름 속성이 올바르게 생성됩니다.

for(int i=0; i<Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">                
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;               
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}

이를 위해서는 다음이 필요합니다. Model 구현하는 유형 IList 오히려 IEnumerable.

업데이트. UI가 없는 다른 값의 경우 숨겨진 필드를 사용하여 사용자에게 표시되지 않고 서버에 게시되도록 할 수 있습니다.

<label>@Model[i].service.Name</label>
<span class="field">                
    @Html.CheckBoxFor(model => model[i].sms)
    SMS &nbsp;&nbsp;               
    @Html.CheckBoxFor(model => model[i].email)
    Email &nbsp;&nbsp;
    @Html.HiddenFor(mode => model[i].userId)
    @Html.HiddenFor(mode => model[i].service.Name)
    ...other field of service you want to be posted...
</span>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top