如何将键/值对表示为ASP.NET MVC模型?我的表单数据不受强类型模型的支持。
我的第一个解决方案是使用Razor设计我的表单并使用一些扩展方法来获取FormElement值。
@model IEnumerable<FormElementKeyValues>
@Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br />
这可行,但当我想处理来自POST的数据时,它会变得混乱。我没有模型,所以我被迫退回使用FormCollection,这意味着我失去了强类型模型和验证的好处。
第二个解决方案(我还没有尝试过这个)就是创建我个人的表单模型并用自定义属性装饰属性,这些属性可以帮助我访问键/值对。
public SimpleFormModel {
[FormElement("Fullname")]
[Required(ErrorMessage = "Required")]
public string Fullname { get; set; }
[FormElement("Email")]
[Required(ErrorMessage = "Required")]
[DisplayName("E-mail")]
public string Email { get; set; }
}
public ComplexFormModel {
[FormElement("Firstname")]
[Required(ErrorMessage = "Required")]
public string Firstname { get; set; }
[FormElement("Surname")]
[Required(ErrorMessage = "Required")]
public string Surname { get; set; }
[FormElement("Email")]
[Required(ErrorMessage = "Required")]
[DisplayName("E-mail")]
public string Email { get; set; }
}
这样我就可以在视图中使用强类型模型以及标准的Razor Html助手。
<div class="editor-field">
@(Html.TextBoxFor(model => model.Firstname))
@(Html.ValidationMessageFor(model => model.Firstname))
@(Html.DisplayFor(model => model.Firstname))
</div>
答案 0 :(得分:1)
我认为你正在使这项任务复杂化......
您可以使用模型渲染,并使用Razor视图进行消费......
例如,假设我有一个销售节日门票的网站,我有一个订单,我希望可以在我销售门票的所有不同活动中重复使用,并且我希望预先填写名称这种形式的事件......这就是你要做的......
首先,你需要一个模型,
public class RegistrationViewModel {
[Display(Name = "Event")]
public string EventName { get; set; }
[Required]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last name")]
public string LastName { get; set; }
}
接下来让我们假设我们有一个名为Events
Register
控制器
public class Events : Controller
{
public ActionResult Register(int id)
{
Event event = DbSource.FindEventById(id);
RegistrationViewModel model = new RegistrationViewModel
{
EventName = event.Name
}
return this.View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegistrationViewModel model)
{
if( ! ModelState.IsValid )
{
return this.View(model);
}
// ship the tickets, return thank you view, etc...
}
}
最后我们的观点......
@model RegistrationViewModel
@using (Html.BeginForm("Register", "Events")
{
<div>
@(Html.AntiForgeryToken())
@(Html.LabelFor(model => model.EventName))
@(Html.ValueFor(model => model.EventName))
@(Html.LabelFor(model => model.FirstName))
@(Html.TextBoxFor(model => model.FirstName))
@(Html.ValidationMessageFor(model => model.FirstName))
@(Html.LabelFor(model => model.LastName))
@(Html.TextBoxFor(model => model.LastName))
@(Html.ValidationMessageFor(model => model.LastName))
</div>
}
我已经动态地写了这个,所以我不知道它是否会按原样编译,但是我已经向你展示的基本上就是它的所有内容......