我正在使用ASP.NET MVC 3。
我有一个名为New的动作方法。当表单验证成功时,我希望Create处理请求。
public ActionResult New()
{
// Code
}
[HttpPost]
public ActionResult Create()
{
// Code
}
我有两个问题。首先,如何修改我的Html.BeginForm来处理上述问题?我尝试了以下但我得到一个错误,它正在寻找物理文件Create(新闻是我的控制器名称):
@using (Html.BeginForm("Create", "News"))
{
<!-- Code -->
}
其次,如何阻止用户在URL中键入/ News / Create。 Create只应处理来自New的帖子请求。
更新: 我设法得到了一些工作。原始网址如下所示:
http://localhost:33947/News/New
点击提交按钮后验证失败,然后网址如下:
http://localhost:33947/News/Create
为什么这样做?我希望它留下来:
http://localhost:33947/News/New
这是我的操作方法代码:
public ActionResult New()
{
return View();
}
[HttpPost]
public ActionResult Create(NewsViewModel newsViewModel)
{
if (!ModelState.IsValid)
{
return View("New", newsViewModel);
}
return View("Index");
}
答案 0 :(得分:2)
@using (Html.BeginForm("Create", "News", FormMethod.Post))
您无法阻止用户手动输入地址,但您可以添加另一个标有[HttpGet]属性的创建操作,该操作将向用户显示错误页面。无论如何,您当前的Create操作方法将不会处理此类请求。在这种情况下,用户可能会得到标准的File not found错误。
更新: Html.BeginForm("Create", "News")
表示将表单提交给控件“新闻”的操作“创建”,因此它可以正常工作。如果您要提交至/ News / New,请将其替换为Html.BeginForm("New", "News")
。
答案 1 :(得分:2)
关于你的第二个问题,而不是:
if (!ModelState.IsValid)
{
return View("New", newsViewModel);
}
你应该使用:
if (!ModelState.IsValid)
{
return RedirectToAction("new");
}
现在,这会对您的Modelstate丢失产生不良影响。 (表单中未显示验证错误。
要解决此问题,请在ModelStateToTempData
和new
操作中添加create
属性。
此属性是http://mvccontrib.codeplex.com/的一部分。