C# ASP.NET初学者:带模型验证的表单往返

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

我请求学习Asp.net和C#大约一周。到目前为止,我一直在用PHP和Symfony进行开发,所以这对我来说是一个很大的转变。我正在学习Asp.net从一本书Asp.NETMVC4的行动

我试图验证一个模型,但我在网上找不到任何能帮助我这样的新手的东西。模型验证带有姓名、电子邮件和消息的联系人表单。很简单,对吧?。不适合我

这是模型

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
}