2012-09-25 238 views
0

編輯:閱讀我的問題的底部,看看有什麼我實際上做了。我接受了不同的答案,但因爲我的解決方案需要AngularJS。多個提交按鈕/值


我使用的是C#4.0和MVC 3/Razor。我更願意利用框架的現有功能,而不是製作自己的幫手類。下面是我在做什麼,簡化:

這裏是我的模型:

MyModel.cs

public class MyModel 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
} 

而且我認爲,到目前爲止:

Index.cshtml

@model IEnumerable<MyModel> 

Please select a Model. 

<select name="id"> 
    @foreach (var m in Model) 
    { 
     <option value="@(m.ID)">@(m.ID) - @(m.Name)</option> 
    } 
</select> 

我的控制器:

MyController.cs

public class MyController : Controller 
{ 
    public ActionResult Index() { /* ... */ } 
    public ActionResult Display(int id) { /* ... */ } 
    public ActionResult Delete(int id) { /* ... */ } 
    public ActionResult Edit(int id) { /* ... */ } 
} 

在我看來,我想有三個提交按鈕,每個按鈕鏈接到不同的控制器/動作,一個是編輯,刪除和顯示。不過,我希望用戶選擇傳遞的ID(通過GET)。我該怎麼做呢?

我知道我可以做的基礎上,inputsubmit類型元素的value一個新的控制器動作,其唯一目的是確定選擇哪三個的,但做法似乎醜陋的我;我想繞過這一步。理想的情況是我想要的東西,如:

@using (Html.BeginForm("", "", FormMethod.Get)) 
{ 
    <select name="id"> 
     @foreach (var m in Model) 
     { 
      <option value="@(m.ID)">@(m.ID) - @(m.Name)</option> 
     } 
    </select> 

    @Html.SubmitButton("Edit", "My") 
    @Html.SubmitButton("Delete", "My") 
    @Html.SubmitButton("Display", "My") 
} 

但我無法找到任何Html方法簽名,似乎做那樣的事。


編輯:

這裏是我結束了去。它使用名爲AngularJS的JavaScript庫,但不需要額外的JavaScript管道。它只是工作。

@model IEnumerable<MyModel> 
<html> 
    <head> 
     <script type="text/javascript" src="../../Scripts/angular.js"></script> 
    </head> 
    <body ng-app> 
     <select ng-model="ID"> 
      @foreach (var m in Model) 
      { 
       <option value="@(m.ID)">@(m.ID) - @(m.Name)</option> 
      } 
     </select> 

     @{ 
      var forms = new[] 
      { 
       new { ActionName = "Display", ControllerName = "My" }, 
       new { ActionName = "Edit", ControllerName = "My" }, 
       new { ActionName = "Delete", ControllerName = "My" } 
      }; 

      foreach (var form in forms) 
      { 
       using (Html.BeginForm(form.ActionName, form.ControllerName, FormMethod.Get)) 
       { 
        <input type="submit" value="@(form.ActionName)" ng-disabled="ID == null"/> 
        <input type="hidden" name="id" value="{{ID}}"/> 
       } 
      } 
     } 

    </body> 
</html> 

回答

1

EditDisplay,很明顯,你並不需要一個表單提交。你可以使用GET。因此,可以使用Html.ActionLink幫助器方法來顯示一個鏈接,該鏈接將用戶指派給屏幕(操作方法)。

從下拉傳遞選定項的值中的鏈接,你可以在點擊事件與Java腳本所選擇的值,併發送至操作方法。

@Html.ActionLink("Edit","Edit","YourController",null ,new {@class="lnk"}) 
@Html.ActionLink("Display","Display","YourController",null ,new {@class="lnk"}) 
@Html.ActionLink("Delete","Delete","YourController",null ,new {@class="lnk"}) 

現在的JavaScript捕捉到這些鏈接的點擊事件

$(function(){ 
    $("a.lnk").click(function(e){ 
    e.preventDefault(); 
    var targetUrl=$(this).attr("href"); 
    var selectedVal=$("#YourDropdownID").val(); 
    targetUrl=targetUrl+"?id="+selectedVal; 
    window.location.href=url; 
    }); 
}); 

進行刪除,您可能會顯示一個鏈接,將用戶帶到一個確認屏幕,那裏你可以有一個提交按鈕,請提交HTTPPOST

您可以自定義CSS使a標籤看起來像一個提交按鈕

此外,不要渲染使用foreach循環在視圖下拉。在MVC中已經有了HTML Helper方法。你應該經常使用它。 Here是解釋如何做到這一點的答案。

+0

這種做法並不讓我使用HTML選擇列表,不過,不是嗎? –

+0

你想在下拉菜單中傳遞所選項目的ID嗎? – Shyju

+0

是的。我不想使用JavaScript,因爲這看起來應該很簡單。 –

2

你可以(我有)使用屬性來做到這一點。嘗試過幾個different variations在我這一個解決的主題:

http://blog.ashmind.com/2010/03/15/multiple-submit-buttons-with-asp-net-mvc-final-solution/

它根據你提交的名稱基本路線。對於您的情況:

<input type="submit" name="delete" value="Delete" /> 
<input type="submit" name="Edit" value="Edit" /> 

和控制器

public class MyController : Controller { 
    [HttpParamAction] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(int id) { 
    } 

    [HttpParamAction] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Delete(int id) { 

    } 
} 

屬性

public class HttpParamActionAttribute : ActionNameSelectorAttribute { 
     public override bool IsValidName(ControllerContext controllerContext, 
             string actionName, MethodInfo methodInfo) 


{ 

      if (actionName.Equals(methodInfo.Name, 
            StringComparison.InvariantCultureIgnoreCase)) 
       return true; 

      if (!actionName.Equals("Action", 
            StringComparison.InvariantCultureIgnoreCase)) 
       return false; 

      var request = controllerContext.RequestContext.HttpContext.Request; 
      return request[methodInfo.Name] != null; 
     } 
    }