2016-09-07 178 views
2

我是ASP.NET MVC的新手。我有一個提交按鈕和一個html選擇元素的簡單表單,填充了兩個項目。當表單發佈到我的控制器時,所有表單值都爲空。我甚至嘗試用$ .POST來做,而我發送的id變量在它到達控制器時爲null。這裏是我的代碼:在ASP.NET MVC中發佈到控制器後,下拉列表的值爲空

HTML

@using (Html.BeginForm("SetOptionForUser", "MyController", FormMethod.Post, new { @class="form-inline" })) 
{ 
    @Html.AntiForgeryToken() 
    <div class="text-center"> 
     <div class="form-group"> 
      <select id="ddlSelect" class="form-control"> 
       @foreach (var item in Model.Persons) 
       { 
        <option value="@item.Id">@item.Name</option> 
       } 
      </select> 
     </div> 
     <button type="submit" class="btn btn-primary" id="btnEnter">Go</button> 
    </div> 
} 

MVC控制器

[ValidateAntiForgeryToken] 
[HttpPost] 
public ActionResult SetOptionForUser(FormCollection form) 
    { 
     string option = form["ddlSelect"].ToString(); //null error 
     return RedirectToAction("AnotherAction", "AnotherController"); 
    } 

似乎沒有什麼形式被髮送。我也試過這樣:

JS

$("#btnEnter").click(function (e) { 
    var optionId = $("#ddlSelect").val(); //this get val correctly 
    $.post(@Url.Action("SetOptionForUser", "MyController"), optionId); 
    }); 

MVC控制器JS方法

**MVC Controller** 

[ValidateAntiForgeryToken] 
[HttpPost] 
public ActionResult SetOptionForUser(int optionId) //null 
    { 
     string option = optionId.ToString(); //null error 
     return RedirectToAction("AnotherAction", "AnotherController"); 
    } 

我做錯了嗎?

回答

3

普通形式提交

你的普通形式提交應工作,如果你選擇的元素名稱和您的HTTP POST操作方法參數的名稱相同。

<select name="selectedPerson" id="selectedPerson" class="form-control"> 
    <!-- Options goes here --> 
</select> 

和動作方法

[HttpPost] 
public ActionResult SetOptionForUser(string selectedPerson) 
{ 
    string option = selectedPerson; 
    return RedirectToAction("AnotherAction", "AnotherController"); 
} 

你也可以考慮使用Html.DropDownListForHtml.DropDownList輔助方法來從項目的清單(SELECT元素,而不是手工編寫的循環來渲染選項項目)。

使用Ajax

現在正在發送數據,如果你想這是Ajax化,你可以在任何查詢字符串或請求體

$(function(){ 
    $("#btnEnter").click(function (e) { 
    e.preventDefault(); 
    var optionId = $("#selectedPerson").val(); 
    $.post('@Url.Action("SetOptionForUser", "MyController")', { selectedPerson:optionId}); 
    }); 
}); 

發送數據現在有在返回毫無意義RedirectResult爲ajax調用。你可能會考慮從你的action methodo和$ .post的成功回調中返回一個json響應(表明你的動作是否成功),你可以檢查這個值並確實需要。

[HttpPost] 
public ActionResult SetOptionForUser(string selectedPerson) 
{ 
    string option = selectedPerson; 
    return Json(new {status="success"}); 
} 

而且你可以檢查在回調

var optionId = $("#selectedPerson").val(); 
var url="@Url.Action("SetOptionForUser", "MyController")"; 
$.post(url, { selectedPerson:optionId}, function(response){ 
    if(response.status==="success") 
    { 
     alert("Success"); 
    } 
    else 
    { 
    alert("Some trouble!"); 
    } 
}); 
0

ASP中FormCollection響應。NET MVC是依賴於輸入元素的name屬性,則name屬性添加到您的select HTML元素,就像這樣:

<select id="ddlSelect" name="ddlSelect" class="form-control"> 

注:id屬性是如何找到在DOM和name屬性的東西爲獲取包括哪些/形式


至於JavaScript的jQuery的AJAX POST問題提交,我相信這個問題是jQuery是做一個聰明的猜測,你optionId是文字。您應該創建一個對象文本保存JSON數據,然後字符串化該值發送到控制器,就像這樣:

var dataForServer = { 
    optionId: optionId 
}; 

$.post(@Url.Action("SetOptionForUser", "MyController"), 
     JSON.stringify(optionId), 
     null, 
     json); 
0

,我看到在你的代碼唯一缺少的就是你的下拉的name屬性。

<select id="ddlSelect" name="ddlSelect" class="form-control"> 
      @foreach (var item in Model.Persons) 
      { 
       <option value="@item.Id">@item.Name</option> 
      } 
     </select> 

使用的FormCollection

string option = form["ddlSelect"].ToString(); 

,但你的下拉沒有一個名稱屬性和形式收集你的第一個例子你是使用name屬性爲基準,這就是爲什麼你得到一個空值。

同去與你的第二個例子引用下拉name屬性,而不是ID在參數

public ActionResult SetOptionForUser(int myDropDownName) //null 
{ 
    string option = myDropDownName.ToString(); //null error 
    return RedirectToAction("AnotherAction", "AnotherController"); 
} 
0

在ASP.NET MVC中的FormCollection越來越輸入元素

的name屬性這麼加此屬性NAME = 「ddlSelect」

0

MattoMK,

請POS t代碼爲您的模型。 通常情況下,模型將保存您的webform運行所需的所有數據,並將您的帖子發回數據。在你看來,你應該選擇一個模型領域。你似乎有Model.Persons,它可能是一個描述人類的類的枚舉。

模型

你沒有描述你的模型,所以假的一個顯示只有兩個屬性,一個字符串來保存列表選擇和你的人員名單。希望你的HttpGet Action可以正確地填充你的模型。

public class MyModel 
{ 
public string ddSelect { get ; set; } 
public List<Person> Persons { get ; set; } 
} 

HTML(通常稱爲視圖)

我們明確地告訴世人,這種觀點使用此模式。

@model MyModel // Tell MVC what model we are using for this view 
@using (Html.BeginForm("SetOptionForUser", "MyController", FormMethod.Post, new { @class="form-inline" })) 
    { 
    @Html.AntiForgeryToken() 
    <div class="text-center"> 
     <div class="form-group"> 
     @Html.DropDownListFor(m => m.ddSelect, Model.PersonList, new {id = "ddlSelect"})   
     </div> 
     <button type="submit" class="btn btn-primary" id="btnEnter">Go</button> 
    </div> 
} 

MVC控制器 你的控制器期待您的視圖返回類型爲MyModel模型,因而會嘗試表單變量推入你的模型的副本(如果可以)。由於你的表單沒有填寫模型屬性,你會得到空值。

[ValidateAntiForgeryToken] 
[HttpPost] 
public ActionResult SetOptionForUser(MyModel theModel, FormsCollection collection) 
{ 
    var selectedName = theModel.ddSelect; 
    return RedirectToAction("AnotherAction", "AnotherController"); 
} 

這應該返回從下拉列表中選擇的值。注意從您的站點生成的HTML(在瀏覽器中按F12並查看源代碼)以查看MVC如何執行操作。玩起來比打起來容易。在上面的POST動作中,請參閱包含的參數集合...它包含所有的表單變量。如果需要,可以通過查找非模型值。這不是必需的,可以刪除,但在該集合中探討如何在POST上構建數據。

希望這有助於。