一、問題
剛打開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