我是新來的MVC,不太瞭解它很好,所以請不要用一些硬性條款。MVC 5按鈕操作
我有一個表單有2個輸入和1個輸入類型提交,我想做一個函數,檢查這2個輸入的值是否相同。如果索引在家裏,我應該在Controller Home中寫這個函數嗎?
我該如何調用該特定功能,以及如何獲取2個值(來自輸入)。 我可以很容易地做到這一點在JavaScript中,但我需要做到這一點MVC,我還沒有找到任何好的教程來學習這一點(所以如果你知道一個初學者請給我)。
我是新來的MVC,不太瞭解它很好,所以請不要用一些硬性條款。MVC 5按鈕操作
我有一個表單有2個輸入和1個輸入類型提交,我想做一個函數,檢查這2個輸入的值是否相同。如果索引在家裏,我應該在Controller Home中寫這個函數嗎?
我該如何調用該特定功能,以及如何獲取2個值(來自輸入)。 我可以很容易地做到這一點在JavaScript中,但我需要做到這一點MVC,我還沒有找到任何好的教程來學習這一點(所以如果你知道一個初學者請給我)。
首先,定義一個ViewModel
其表示在所述控制器和視圖(控制器經由Controller.View(Object model)
方法把它傳遞給視圖,視圖經由<form>
提交其傳遞迴給控制器)之間交換的數據。
你的情況:
class HomeViewModel {
public String FirstValue { get; set; }
public String SecondValue { get; set; }
public String Message { get; set; }
}
你的剃鬚刀.cshtml
應該是這樣的:
@model HomeViewModel
<p>@(this.Model.Message)</p>
using(Html.BeginForm()) {
<div>
@Html.LabelFor(m => m.FirstValue)
@Html.TextBoxFor(m => m.FirstValue)
</div>
<div>
@Html.LabelFor(m => m.SecondValue)
@Html.TextBoxFor(m => m.SecondValue)
</div>
<button type="submit">Submit form</button>
}
然後在你的控制器的POST
動作/處理器可以應用自定義邏輯:
public class HomeController {
public ActionResult Index() {
return this.View(new HomeViewModel());
}
[HttpPost]
public ActionResult Index(HomeViewModel model) {
if(model == null) return this.NotFound();
if(model.FirstValue == model.SecondValue) {
model.Message = "Values match";
}
else {
model.Message = "Values are different";
}
return this.View(model);
}
}
請注意,Message
屬性是一個w ay因爲它從未由視圖設置(因爲它不通過任何<input />
元素進行維護)。
有些人,包括我自己,都覺得單向數據不應該在ViewModel
而應是ViewData
集合中,如果這樣的話做這樣的:
if(model.FirstValue == model.SecondValue) {
this.ViewData["message"] = "Values match";
}
else {
this.ViewData["message"] = "Values are different";
}
//
<p>@(this.ViewData["message"])</p>
注意ViewData
只是一個字符串字典,而ViewModel
是強類型的。有一個技巧可以獲得強類型ViewData
,但它有點複雜,我現在不會進入它。
正如你的問題的評論稱,如果你的「值相等」的邏輯更關心的是驗證比實際的業務邏輯,那麼你使用很富裕內置的驗證屬性,最大限度地減少量的代碼,你需要寫:
[Compare("OtherPropertyName", ErrorMessage = "The values must match.")]
您可能還需要添加[DisplayName]
和[Required]
太:
像這樣:
class HomeViewModel {
[DisplayName("First value")]
[Required]
public String FirstValue { get; set; }
[DisplayName("Second value")]
[Required]
[Compare(nameof(this.FirstValue), ErrorMessage = "Second value must match First value.")]
public String SecondValue { get; set; }
}
而在你的看法:
<div>
@Html.LabelFor(m => m.FirstValue)
@Html.TextBoxFor(m => m.FirstValue)
@Html.ValidationMessageFor(m => m.FirstValue)
</div>
<div>
@Html.LabelFor(m => m.SecondValue)
@Html.TextBoxFor(m => m.SecondValue)
@Html.ValidationMessageFor(m => m.SecondValue)
</div>
而在你POST
動作/處理器:
[HttpPost]
public ActionResult Index(HomeViewModel model) {
if(!this.ModelState.IsValid) return this.View(model);
// ...
這是學習[模型驗證(https://docs.microsoft的好地方。com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/added-validation-to-the-model),你可以編寫一個屬性來檢查屬性是否與另一個定義匹配屬性。看看你自己的自定義模型驗證屬性 – maccettura