2017-03-07 77 views
0

我是新來的MVC,不太瞭解它很好,所以請不要用一些硬性條款。MVC 5按鈕操作

我有一個表單有2個輸入和1個輸入類型提交,我想做一個函數,檢查這2個輸入的值是否相同。如果索引在家裏,我應該在Controller Home中寫這個函數嗎?

我該如何調用該特定功能,以及如何獲取2個值(來自輸入)。 我可以很容易地做到這一點在JavaScript中,但我需要做到這一點MVC,我還沒有找到任何好的教程來學習這一點(所以如果你知道一個初學者請給我)。

+1

這是學習[模型驗證(https://docs.microsoft的好地方。com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/added-validation-to-the-model),你可以編寫一個屬性來檢查屬性是否與另一個定義匹配屬性。看看你自己的自定義模型驗證屬性 – maccettura

回答

2

首先,定義一個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); 

    // ...