Mr *_*nes 5 forms asp.net-mvc viewmodel
我有一个包含两个对象的ViewModel:
public class LookUpViewModel
{
public Searchable Searchable { get; set; }
public AddToSearchable AddToSearchable { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
两个包含的模型看起来像这样:
public class Searchable
{
[Key]
public int SearchableId { get; set; }
public virtual ICollection<AddToSearchable> AddedData { get; set; }
}
public class AddToSearchable
{
[Key]
public int AddToSearchableId { get; set;}
[Required]
public int SearchableId { get; set; }
[Required]
public String Data { get; set; }
[Required]
public virtual Searchable Searchable { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个视图,使用我LookUpViewModel和接收输入来搜索SearchableId.如果Searchable找到该LookUpViewModel对象,则会创建一个对象并将其传递给View.然后视图显示编辑器字段AddToSearchable.Data.提交后,我希望将LookUpViewModel其传递给action方法来处理所有后端代码.唯一的问题是,LookUpViewModel传递给我的action方法包含一个null引用Searchable和一个有效的引用AddToSearchable..即我丢失了一半的数据.
以下是我的视图的示例:
@model HearingAidTrackingSystem.ViewModels.LookUpViewModel
@using (Html.BeginForm("LookUp", "Controller", "idStr", FormMethod.Post))
{
<input type="text" name="idStr" id="idStr"/>
<input type="submit" value="Search" />
}
@if (Model.Searchable != null && Model.AddToSearchable != null)
{
using (Html.BeginForm("AddMyStuff", "Controller"))
{
Html.HiddenFor(model => model.Searchable.SearchableId);
Html.HiddenFor(model => model.Searchable.AddedData);
Html.HiddenFor(model => model.AddToSearchable.AddToSearchableId);
Html.HiddenFor(model => model.AddToSearchable.SearchableId);
Html.HiddenFor(model => model.AddToSearchable.Searchable);
<div class="editor-field">
@Html.EditorFor(model => model.AddToSearchable.Data)
@Html.ValidationMessageFor(model => model.AddToSearchable.Data);
</div>
<input type="submit" value="Submit" />
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的行动方法:
public ActionResult LookUp(LookUpViewModel vm)
{
return View(vm);
}
[HttpPost]
public ActionResult LookUp(string idStr)
{
int id = /*code to parse string to int goes here*/;
Searchable searchable = dal.GetById(id);
LookUpViewModel vm = new LookUpViewModel { Searchable = searchable,
AddToSearchable = new AddToSearchable() };
//When breakpoint is set, vm contains valid references
return View(vm);
}
[HttpPost]
public ActionResult AddMyStuff(LookUpViewModel vm)
{
//**Problem lies here**
//Do backend stuff
}
Run Code Online (Sandbox Code Playgroud)
很抱歉这篇冗长的帖子.我尽力保持简单.你可能有任何建议......开火.
修复它的两种方法:
您可以为Model.Searchable的所有属性添加HiddenFor().
您可以使用序列化将Model.Searchable传输到文本表示中,并从控制器中的序列化表单进行修复.
更新:问题是:你需要使用@ Html.HiddenFor(),而不是Html.HiddenFor();.