2010-04-15 79 views
1

我非常沮丧,试图在几年的webforms开发之后切换到MVC。DataBinding ASP.NET MVC中的DropDownList 2

这是我无法解决的极其简单的问题: 我有一张名为StateProvince的表中的状态列表。 我有一个DropDownList。 我想让DropDownList显示所有的状态。

保持简单,我对MVC一无所知。

这是我的。所有这些给了我一个填充“System.Web.Mvc.SelectListItem”的DropDownList。

操作:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     SelectList theList = new SelectList(stateProvinces); 
     ViewData["StateProvince"] = theList; 
     return View(); 
    } 

查看:

<div class="editor-label"> 
       <%: Html.LabelFor(model => model.StateProvinceId) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (SelectList)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+0

是Model.StateProvinces实际上填充了对象AND St​​ateProvinceId包含一个非空值AND模型!= null? – Michel 2010-04-15 20:11:03

+0

你可以展示这个动作吗? – 2010-04-15 20:12:30

+0

好吧我假设创建是你的GET ...哪里是处理帖子和返回结果的代码?这就是我认为问题出在哪里,并且ViewData不会在通话之间持续存在,但我可能完全误解了这个问题。问题是初始加载还是在发布结果并重建视图之后? – Kelsey 2010-04-15 20:52:45

回答

0

常见的浏览器不支持HTML表单中PUT动词。您可能需要处理这个用ajax:

$(function() { 
    // when some button is clicked: 
    $('#someButton').click(function() { 
     $.ajax({ 
      url: '/controller/action', 
      data: { selectedState: $('#StateProvinceId').val() }, 
      type: 'PUT', 
      success: function(data) { 
       alert('state successfully submitted'); 
      } 
     }); 
     return false; 
    }); 
}); 
+0

对不起,我其实是指POST。 – 2010-04-15 19:56:42

0

当数据被公布,在DropDown列出的项目不回发到模型,所以我假设你是不是再次获取它们,并重新将它们添加在将模型返回到视图之前将其添加到模型中。

您需要确保您的帖子中填写了Model.StateProvinces,然后将其传递给您的视图。与WebForms不同,WebForms只会保留这些值,这些值将保留ViewState中的DropDownList项目并为您重建它们。

因此,假如你的控制器看起来像:

// POST: /YourController/YourAction/{ID} 
[HttpPost] 
public ActionResult YourAction(YourModel model, int id) 
{ 
    // model.StateProvinceId has the selected value 

    // you need to fill StateProvinces since it is empty as the list is not posted 
    // back so it is not autofilled into your model. 
    model.StateProvinces = LoadYourStateProvincesList(); 

    // This would blow up if StateProvinces is null because your View is assuming that 
    // it has a valid list of StateProvinces in it to build the DropDown 
    return View(model); 
} 

其实我问了一个问题,而回,可能是一些使用的,以帮助解释如何处理下拉列表:

Best way of implementing DropDownList in ASP.NET MVC 2?

编辑:根据你的评论,你甚至没有得到第一个列表...以及它看起来像你可能没有正确的模型设置。你甚至有模特吗?您的创建仅返回View(),其中没有模型数据。您需要创建一个模型并将其返回。

例如,

public class YourModel 
{ 
    public int StateProvinceId { get; set; } 
    /// ... whatever else you need 
} 

// Then in your view your controller you need to set it and create it 
View(new YourModel() { StateProvinceId = 123 };); 

您需要的型号,以便当窗体回你可以检索值,因为MVC的东西会值到模型就像个例子我张贴以上关于POST部分。

编辑:好了,现在问题更清楚了,比原来的问题简单得多,使问题成为现实。问题是你的SelectList需要告诉它哪些字段放在哪里:你有

SelectList theList = new SelectList(stateProvinces, "Value", "Text"); 

在你原来的问题:

<%: Html.DropDownListFor(model => model.StateProvinceId, new SelectList(Model.StateProvinces, "StateProvinceId", "Name"))%> 

这是完全正确的,但它是如何你建立Model.StateProvinces这是错误的,所以它让我觉得它必须是别的东西。

+0

如何完成以下操作:使DropDownList显示StateProvince表中的行的列表,其中显示在DropDownList中的Text为“Name”列,值为列“StateProvinceId”。 – 2010-04-15 20:50:44

+0

我的意思是,我甚至没有尝试发布数据。 – 2010-04-15 20:51:19

+0

我正在使用POST模型绑定器。 – 2010-04-15 21:09:49

1

这是我一直在寻找:

操作:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     ViewData["StateProvince"] = stateProvinces; 
     return View(); 
    } 

查看:

<div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (IEnumerable<SelectListItem>)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+1

没有模型被分配到视图,所以'model => model.StaeProvinceId'如何工作?看看我对我的回答所做的修改。 – Kelsey 2010-04-15 21:15:25

1

尝试更换此

SelectList theList = new SelectList(stateProvinces); 

这... ...

SelectList theList = new SelectList(stateProvinces, "Value", "Text");