我仍然處在MVC的學習過程中,很長一段時間來自Web窗體。我試圖理解的一件事是將按鈕/輸入與ActionResult關聯的適當方式。澄清接線按鈕到ActionResult
我一直用作示例的項目之一是Contoso大學。在該項目中,他們有一個CourseController,在Course/Edit.cshtml頁面中他們使用一個不指定控制器或操作方法的表單。所以我不清楚表單如何知道它需要去哪裏,因爲表單或按鈕都不指向控制器/操作方法。是因爲該頁面被命名爲Edit並且ActionResult也被命名爲Edit?
這是Contoso .cshtml和控制器中的ActionResult。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Course</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.CourseID)
<div class="form-group">
@Html.LabelFor(model => model.CourseID, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DisplayFor(model => model.CourseID)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Credits, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Credits, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Credits, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="DepartmentID">Department</label>
<div class="col-md-10">
@Html.DropDownList("DepartmentID", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.DepartmentID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var courseToUpdate = db.Courses.Find(id);
if (TryUpdateModel(courseToUpdate, "",
new string[] { "Title", "Credits", "DepartmentID" }))
{
try
{
db.SaveChanges();
return RedirectToAction("Index");
}
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
}
PopulateDepartmentsDropDownList(courseToUpdate.DepartmentID);
return View(courseToUpdate);
}
而且我已經與一些搜索找到另一件事是開發者調用形式控制器/操作方法,以及直接通過按鈕或輸入指向控制器/操作方法。
在這裏,他們在窗體中添加它。
@using (Html.BeginForm("SignUp", "Account", FormMethod.Post))
{
<!-- form goes here -->
<input type="submit" value="Sign Up" />
}
這裏它直接在按鈕中。
<button type="button" onclick="location.href='@Url.Action("MyAction", "MyController")'" >
使用這些方法有什麼優點/缺點嗎?對我而言,如果將控件/方法放在表單聲明中或直接放在按鈕上,這似乎更加清晰。
感謝您的解釋。這絕對有幫助。因此,基本上,因爲Contoso示例沒有專門向表單添加任何內容,所以它將根據.cshtml的名稱提取方法名稱,並且因爲它發現控制器文件夾中的View文件,它將假定作爲要使用的控制器。否則,如果我想從用於顯示錶單的控制器/視圖中獲取不同的控制器或方法名稱,則必須在Html.BeginForm聲明中指定該名稱。 – Caverman