2015-10-08 85 views
0

在我看來,我有兩種形式。一種形式搜索記錄。一個用於支持分頁的轉到頁面{頁數}的表單。幾乎所有人都在similar question中建議,我必須爲每個表單創建兩個單獨的操作。這將使我的工作變得非常簡單,但使用這些方法時遇到問題。在ASP.Net中有單一模型的兩種形式MVC

假設我有以下型號:

public class MyModel 
{ 
    public string Name { get; set; } 
    public string DateOfEmployment { get; set; } 

    public int? PageNumber { get; set; } 

} 

而以下幾種觀點:

@model WebApplication1.Models.MyModel 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { })) 
{ 


    @Html.LabelFor(m => m.DateOfEmployment) 
    @Html.EditorFor(m => m.DateOfEmployment) 

    @Html.LabelFor(m => m.Name) 
    @Html.TextBoxFor(m => m.Name) 

    <input type='Submit' value='Search' /> 

} 

<!-- Rows goes here--> 


@using (Html.BeginForm("Pagination", "Home", FormMethod.Post, new { })) 
{ 


    @Html.LabelFor(m => m.PageNumber) 
    @Html.TextBoxFor(m => m.PageNumber) 

    <input type='Submit' value='Go' /> 

} 

問題是,當用戶點擊Go按鈕,我怎麼能知道什麼是搜索字段值重新模型行?。如果我使用單個表單,我不知道點擊了哪個按鈕(以乾淨的方式)。那麼在這種情況下我該怎麼做?

+1

你可以;在Session中保存搜索字段或將它們作爲隱藏字段傳遞。 –

+0

@ErikPhilips你也同意有兩種形式有這些問題嗎? –

+2

爲什麼你需要兩種形式?爲什麼不有一個動作將你的整個模型與這種形式的所有字段相結合? – Jakotheshadows

回答

3

你不必採取2種形式做到這一點,有一個簡單的方法,採取單一的形式有兩個按鈕是這樣的:

<button type='Submit' name="command" value='Search'>Search</button> 

<button type='Submit' name="command" value='Go'>Go</button> 

我們認識哪個按鈕被點擊,你可以做到這一點的行動水平:

[HttpPost] 
public ActionResult Index(string command) 
{ 
    if(command == "Go") 
    { 
     //Do stuff 
    } 
    else 
    { 
     //do stuff 
    } 
} 
+0

我認爲整個想法是他想要不同的命令去採取不同的行動。 – Jakotheshadows

+0

@Jakotheshadows這是在原來的問題:「如果我使用單一形式,我不知道哪個按鈕點擊(以一種乾淨的方式),那麼我應該在這種情況下做什麼?」。我認爲這清除了它 –

0

您需要將搜索數據(您的案例中的名稱和日期)存儲在ASP.NET中很舒適的會話中,因爲它可能存儲整個對象。請參閱下面的問題如何做到這一點:How to use sessions in an ASP.NET MVC 4 application?

或者你可以將它們傳遞到你的第二個表格的要求,我會解決這個問題:

@using (Html.BeginForm("Pagination", "Home", FormMethod.Post, new { dateOfEmployment = Model.DateOfEmployment, name = Model.Name })) 
    // ... 
} 

這將導致這樣的操作:

[HttpPost] 
public ActionResult Pagination(string dateOfEmployment, string name) { 
    // ... 
} 

可選地其也可以將它們傳遞作爲POST形式隱藏字段等

@using (Html.BeginForm("Pagination", "Home", FormMethod.Post)) { 
    // ... 
    @Html.HiddenFor(model => model.DateOfEmployment) 
    @Html.HiddenFor(model => model.Name) 
} 

順便說一句,我會建議使用正確的類型,如DateTime爲您的屬性DateOfEmployment。這將使認爲更加乾淨和容易。尤其是當您必須過濾您的數據表單或其他類型的視圖。

+0

你的方法很好。但是我的隱藏字段列表太長而無法以分頁形式返回。 –

+0

我不明白爲什麼你的答案有一個叫做「分頁」的行爲,但沒有頁碼作爲參數,爲什麼你不會把整個模型作爲一個參數。 – Jakotheshadows

1

,如果你是布萊恩實現在這裏1種形式是somenthign,也許可以幫助你

創建一個幫助

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MultipleButtonAttribute : ActionNameSelectorAttribute 
{ 
    public string Name { get; set; } 
    public string Argument { get; set; } 

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     var isValidName = false; 
     var keyValue = string.Format("{0}:{1}", Name, Argument); 
     var value = controllerContext.Controller.ValueProvider.GetValue(keyValue); 

     if (value != null) 
     { 
      controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument; 
      isValidName = true; 
     } 

     return isValidName; 
    } 
} 

然後在你的控制器

[HttpPost] 
    [MultipleButton(Name = "action", Argument = "Step1")] 
    public ActionResult Step1(YourModelType model) 
    {} 

    [HttpPost] 
    [MultipleButton(Name = "action", Argument = "Step2")] 
    public ActionResult Step2(YourModelType model) 
    {} 

,然後在您的視圖

<form> 
    <input type="submit" value="Step1" name="action:Step1" class="button admin-button"> 
    <input type="submit" value="Step2" name="action:Step2" class="button admin-button"> 
</form> 
1

使用一些JavaScript,你可以只使用一種形式和簡單地改變基於表單的作用點擊哪個按鈕,這樣無論您發佈哪個操作,都會包含所有表單字段。

@model WebApplication1.Models.MyModel 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { id="MyForm" })) 
{ 
    @Html.LabelFor(m => m.DateOfEmployment) 
    @Html.EditorFor(m => m.DateOfEmployment) 

    @Html.LabelFor(m => m.Name) 
    @Html.TextBoxFor(m => m.Name) 

    @Html.LabelFor(m => m.PageNumber) 
    @Html.TextBoxFor(m => m.PageNumber) 

    <button value='Search' onclick="search()" /> 
    <button value='Go' onclick="go()" /> 
    <input type="submit" style="display:none" /> 
} 

<script type="text/javascript"> 
    function search() { 
     var form = document.getElementById("MyForm"); 
     form.action = "@Url.Action("ActionNameForSearch", "ControllerNameForSearch")"; 
     form.submit(); 
    } 
    function go() { 
     var form = document.getElementById("MyForm"); 
     form.action = "@Url.Action("ActionNameForGo", "ControllerNameForGo")"; 
     form.submit(); 
    } 
</script> 
相關問題