带有负载和表单模型的MVC视图
c#
我有一个像表单一样工作的视图,因此它加载一堆下拉列表并从ActionResult Index
. 将所有数据输入表单后,我将使用Html.BeginForm("Create"
调用 save 方法。的ActionResult Create(RequestForm model)
。所以问题是我想使用两种模型,一种用于加载,一种用于保存数据。我现在正在做的是从 FormViewModel 和 RequestForm 模型中获取对象。
有一个更好的方法吗?
看法:
@model FormViewModel
@using (Html.BeginForm("Create", "RequestForm", FormMethod.Post))
{
@Html.ValidationSummary(true);
<div>
<h4>* Country</h4>
@Html.TextBoxFor(x => x.CountryId, new { id = "ddlCountry", @class = "form-control" })
@Html.ValidationMessageFor(model => model.CountryId)
</div>
}
窗体视图模型
[Required]
public int? CountryId { get; set; }
public List<CountryModel> ListOfCountries { get; set; }
申请表模型
public class RequestForm
{
[Required]
public int? CountryId { get; set; }
}
控制器
public ActionResult Create(RequestForm model)
{
var FormInfo = FormCreate(model);
return View("");
}
回答
您可以嵌套视图模型,并仅在表单发布时提交您想要的模型。
例如:
public class FormViewModel
{
public IEnumerable<CountryViewModel> AvailableCountries { get; set; }
public CreateRequestViewModel Data { get; set; }
}
public class CountryViewModel
{
public int CountryId { get; set; }
public string CountryName { get; set; }
}
public class CreateRequestViewModel
{
[Required]
public int SelectedCountryId { get; set; }
}
我只是编了个名字,但希望你能明白。
然后在视图上,您可以按如下方式进行设置:
@model FormViewModel
@using (Html.BeginForm("Create", "RequestForm", FormMethod.Post))
{
@Html.ValidationSummary(true);
<div>
<h4>* Country</h4>
@Html.DropDownListFor(
x => x.Data.SelectedCountryId,
new SelectList(Model.AvailableCountries, "CountryId", "CountryName"),
new { id = "ddlCountry", @class = "form-control" }
)
@Html.ValidationMessageFor(x => x.Data.SelectedCountryId)
</div>
}
再次,我手工编写,因此可能存在编译错误。但想法是您使用DropDownListFor()
,而不是TextBoxFor()
,生成一个下拉AvailableCountries
列表,其中包含您填充的列表生成的选项。
而且您只需要放置[Required]
您要将数据发布到的视图模型,因为它正在验证用户的数据。你不需要把它放在 ,CountryViewModel
因为你自己填充列表。
最后,还有一件更重要的事情你需要注意,那就是表单发送到的方法上的参数名称:
@model FormViewModel
@using (Html.BeginForm("Create", "RequestForm", FormMethod.Post))
{
@Html.ValidationSummary(true);
<div class="k-content">
<h4>* Country</h4>
@Html.DropDownListFor(
x => x.Data.SelectedCountryId,
new SelectList(Model.AvailableCountries, "CountryId", "CountryName"),
new { id = "ddlCountry", @class = "form-control" }
)
@Html.ValidationMessageFor(x => x.Data.SelectedCountryId)
</div>
}
参数的名称必须与您在外部模型中声明的名称相匹配FormViewModel
。