C# ASP.NET初学者:带模型验证的表单往返
我请求学习Asp.net和C#大约一周。到目前为止,我一直在用PHP和Symfony进行开发,所以这对我来说是一个很大的转变。我正在学习Asp.net从一本书Asp.NETMVC4的行动 我试图验证一个模型,但我在网上找不到任何能帮助我这样的新手的东西。模型验证带有姓名、电子邮件和消息的联系人表单。很简单,对吧?。不适合我 这是模型C# ASP.NET初学者:带模型验证的表单往返,c#,asp.net-mvc,C#,Asp.net Mvc,我请求学习Asp.net和C#大约一周。到目前为止,我一直在用PHP和Symfony进行开发,所以这对我来说是一个很大的转变。我正在学习Asp.net从一本书Asp.NETMVC4的行动 我试图验证一个模型,但我在网上找不到任何能帮助我这样的新手的东西。模型验证带有姓名、电子邮件和消息的联系人表单。很简单,对吧?。不适合我 这是模型 public class ContactModel { [Required(ErrorMessage = "The name has to be provi
public class ContactModel
{
[Required(ErrorMessage = "The name has to be provided, even a fictional one")]
public string Name { set; get; }
[Required(ErrorMessage = "Email address has to be provided, even a invalid one")]
[DataType(DataType.EmailAddress)]
public string Email { set; get; }
[Required(ErrorMessage = "Don't be lazy. Write a message")]
[DataType(DataType.MultilineText)]
public string Message { set; get; }
}
我有一个叫ContactController的控制器。它有这些动作
public ActionResult Contact()
{
ContactModel contactModel = new ContactModel();
return View(contactModel);
}
[HttpPost]
public ViewResult SaveModel(ContactModel model)
{
return View(model);
}
另外,这里有一个Razor模板,它在UI中显示模型
<div class="UI__Main Main__Contact">
<h1 class="UI__Main--SectionHeader">Contact the administrators of Life</h1>
@using (Html.BeginForm("SaveModel", "Contact", FormMethod.Post, new { @class="Form Form__Contact" }))
{
<div class="Form__Row">
@Html.LabelFor(model => model.Name, new { @class="Form__Label" })
@Html.TextBoxFor(model => model.Name, new { @class="Form__TextType Form__TextInput" })
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="Form__Row">
@Html.LabelFor(model => model.Email, new { @class = "Form__Label" })
@Html.TextBoxFor(model => model.Email, new { @class = "Form__TextType Form__TextInput" })
</div>
<div class="Form__Row">
@Html.LabelFor(model => model.Message, new { @class="Form__Label" })
@Html.TextArea("Message", new { @class = "Form__TextType Form__TextArea" })
</div>
<div class="Form__Row Submit__Row">
<input id="Submit__Button" type="submit" value="Send" />
</div>
}
您的
操作保持为空,因为MVC框架无法解析给定控制器+操作的url。您必须在路由表中显式定义url:
routes.MapRoute(
name: null,
url: "contact/send-form",
defaults: new { controller = "Contact", action = "SaveModel" }
);
或者,您也可以生成通用的回退路线
routes.MapRoute(
name: null,
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
这将导致您的所有控制器/操作都可以作为直接URL使用
或者;您还可以使用,以便直接在操作中定义路由,而不必到处查看。为此,您必须:
- 添加
routes.mapmvcattributterroutes()在registerOutes.cs
- 将属性附加到您的操作
[路由(“联系人”)]
如果http方法不同,也可以重新使用相同的路由:
[HttpGet]
[Route("contact"}
public ActionResult Contact()
{
ContactModel contactModel = new ContactModel();
return View(contactModel);
}
[HttpPost]
[Route("contact")]
public ViewResult Contact(ContactModel model)
{
if(ModelState.IsValid){
//persist your contact form, redirect somewhere
}
return View(model);//re-render the form with error messages
}
除了默认的路由之外,您还实现了其他路由吗?我已经进行了编辑。ContactController/ContactAction是通过静态路由调用的,但我猜模型验证必须转到另一个操作,即ContactController.YES中的SaveModel操作。就这样。非常感谢你。错误消息显示得很好。只有在url必须具有非在路线图中写入的形式的情况下,使用路线
属性才是必要的。建议使用“否则”以避免此参数。这种方式决定了项目的严格方法。
[HttpGet]
[Route("contact"}
public ActionResult Contact()
{
ContactModel contactModel = new ContactModel();
return View(contactModel);
}
[HttpPost]
[Route("contact")]
public ViewResult Contact(ContactModel model)
{
if(ModelState.IsValid){
//persist your contact form, redirect somewhere
}
return View(model);//re-render the form with error messages
}