2016-09-07 171 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上构建数据。

希望这有助于。