>

이것에 대한 많은 예를 보았지만 아무런 효과가 없습니다. 뷰 모델 SomeDataViewModel의 전달을 증명/반증하기 위해이 예제를 작성했습니다.

드롭 다운 목록 데이터를 다시 게시하려고합니다. 모든 것이 정상적으로 작동하지만 TestViewModel의 OtherData 속성은 전달 된 수집을 반환하지 않습니다.

추가 시도 :

@Html.HiddenFor(m => Model.OtherData)

다시 이것은 다음과 같은 오류를 일으킨다;

The parameter conversion from type 'System.String' to type 'SomeDataViewModel' failed because no type converter can convert between these types

코드 :

ViewModels

TestViewmodel

public class TestViewModel
{
    public TestViewModel()
    {
        OtherData = new List<SomeDataViewModel>();
    }
    public int Id { get; set; }
    public String Name { get; set; }
    public DateTime DoB { get; set; }
    public int SelectedOtherData { get; set; }
    public List<SomeDataViewModel> OtherData { get; set; }
    public IEnumerable<SelectListItem> TolistData()
    {
        IEnumerable<SelectListItem> ret = OtherData.Select(i => new SelectListItem() { Text = i.Text, Value=i.Value });

        return ret;
    }
}

SomeDataViewmodel

public class SomeDataViewModel
{
    public string Value { get; set; }
    public string Text { get; set; }
}

보기

@model TestViewModel
@{
    ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Index","Home"))
{
<div class="row">
    <div class="col-md-12">
        <br />
        @Html.EditorFor(m => Model.Id)
        <br />
        @Html.EditorFor(m => Model.Name)
        <br />
        @Html.EditorFor(m => Model.DoB)
        <br/>
        @Html.DropDownListFor(m => Model.SelectedOtherData, Model.TolistData(), new { id = "OtherData" })
        <p><a class="btn btn-default" href="http://go.microsoft.com/fwlink/?LinkId=301865">Learn more &raquo;</a></p>
    </div>
</div>
<button id="dosomething" formmethod="post">Post</button>

}

컨트롤러

   public ActionResult Index()
    {
        var model = new TestViewModel() {
            Id = 99,
            Name = "Billy",
            DoB = DateTime.Now
        };
        model.OtherData.Add(
            new SomeDataViewModel { Text = "Bob", Value = "1" });
        model.OtherData.Add(
            new SomeDataViewModel { Text = "Sally", Value = "2" });
        return View(model);
    }
    [HttpPost]
    public ActionResult Index(TestViewModel retModel)
    {
        if (ModelState.IsValid)
        {
            if (retModel.OtherData.Count() == 0)
            {
                var dud = true;
            }
        }
        return View(retModel);
    }

  • 답변 # 1

    @Html.HiddenFor 를 사용하여 복잡한 데이터에 대해 숨겨진 입력을 렌더링 할 수 없습니다  도우미.

    단순한 유형으로 만 사용해야합니다. 배열이 있으므로 다음과 같이 작성해야합니다.

    @for(int i = 0; i < Model.OtherData.Count(); i++)
    {
        @Html.HiddenFor(m => Model.OtherData[i].Text)
        @Html.HiddenFor(m => Model.OtherData[i].Value)
        //... other fields.
        @Html.HiddenFor(m => Model.OtherData[i].OtherProperty)
    }
    
    

    for 사용   foreach 대신 루프   POST 양식의 올바른 바인딩에 대한 맵핑과 동일해야하므로 .

  • 답변 # 2

    확실히 형식 변환 오류가 있습니다. SelectedOtherData는 int 유형이고 selectlistitem 값은 문자열 유형입니다

  • 이전 두 문자열을 연결하고 C의 세 번째 변수에 저장하는 방법은 무엇입니까?
  • 다음 javascript - 페이지를 새로 고치지 않고 주석을 삭제할 수 있도록 PHP 코드에 AJAX를 구현하려면 어떻게해야합니까?