我开始学习Asp.net和C#大约一个星期了。到目前为止,我一直在开发PHP和Symfony,所以这对我来说是一个很大的转变。我正在从ASP.NET MVC 4 in Action中学习Asp.net。
我正在尝试验证模型,但我找不到任何可以帮助像我这样的新手的在线内容。模型验证具有姓名,电子邮件和消息的联系表单。简单吧?不适合我。
这是模型......
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>
}
当用户提交表单时,表单必须转到SaveModel
中的ContactController
操作,但<form>
的操作属性为空action=""
,所以我不这样做认为它甚至会Save Model
。此外,不显示验证消息。我尝试了@Html.ValidationMessageFor
,但即使我不提交表单,也只显示文本。
我甚至不知道这里的问题是什么,更不用说了。
如果有人有关于在asp.net mvc 4和razor中创建表单的任何建议,教程,文章或类似内容,请将它提供给我。
我已经阅读了这个article,但这并没有解决我的问题。我还找到this Stack question和this Stack question,但正如我所说,我是新手,我真的不明白这些问题中的问题。
编辑:
以下是该应用的路线...
routes.MapRoute(
name: null,
url: "",
defaults: new { controller = "Home", action="Index" }
);
routes.MapRoute(
name: null,
url: "contact",
defaults: new { controller = "Contact", action = "Contact" }
);
答案 0 :(得分:1)
您的action
保持为空,因为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" }
);
这将导致所有控制器/操作都可用作直接网址。
可替换地;您也可以使用attribute routing,这样您的路线就可以直接在动作中定义,而不是在这里看到&amp;那里。为此,你必须:
routes.MapMvcAttributeRoutes();
RegisterRoutes.cs
[Route("contact")]
如果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
}