一、问题
刚打开web服务器时报这个错误
调试了一下,是在启动项中有问题。我的routeconfig是:
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Test", id = UrlParameter.Optional }
);
使用的是Home下的Test方法。Test如下:
public ActionResult Test(LoginViewModel model)
{
TestFun(model);
return View(model);
}
对应的Login.cshtml 文件内容如下:大致内容
@using hust.wlno.QJBZ.Web.ViewModels
@model LoginViewModel
@{
Layout = null;
}
@using (Html.BeginForm("Test", "Login", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Reset your password.</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
这时出现另一个问题:
看到这个我就明白了,基本上是由于action方法在view中没有匹配的对象造成的
二、解决
在web服务器启动时,首先使用控制器中的action方法,然后调用同名的view文件,即我们说的网页来展现界面。必须要保证action方法的名字和view的名字保持一致,这样才可以正常展现。
因此,只要我把action的名字改为和view对应的就好了,同时routeconfig也要改。
页面就可以正常显示了。
三、ViewModel思考
这里是用ViewModel打开界面的。ViewModel是连接Controller和View的一个中间模型,控制器对获取到某个页面的Model进行后续处理,而View是对ViewModel进一步的渲染,展现页面。
参考了师兄写的例子,对于web网站刚启动时,使用是return View()的方式展现。而又重载了一个参数为LoginViewModel的函数,用于后续接受该页面的Model,无论在后台处理,还是与数据库内容比较,都是在取得model之后完成的。控制器接受ViewModel的方法是通过HTTPPost的方式:
[HttpPost]
[ValidateAntiForgeryToken]//防止CSRF攻击
public ActionResult ResetPassword(ResetPasswordViewModel model)
{
string str=model.Email;
model.Code = model.Email;
// Myfun(model,str);//调用Myfun函数进行相应的处理
return View(model);
}
我的理解是,这两部分别用于不同的情况,用的较多的应该是第二种情况,初始启动时展现静态页面就OK,不需要,也没有可以接受的ViewModel