2012-04-01 55 views
0

我要绑定一个radiobuttonlist与dropdownlist postback.for这个我把两个动作在控制中,但是当视图加载一个错误:事实上,在回发下拉列表中想要绑定单选按钮之前,对象refrence null 这一次对象为空 请告诉我绑定一个radiobuttonlist与下拉列表回发

namespace Charge.Models 
    { 
    public class SellChargeModel 
    { 
    public int Id { get; set; } 

    public string Serial { get; set; } 

    public DateTime Date { get; set; } 

    public string Bank { get; set; } 

    public IEnumerable<SelectListItem> Companys { get; set; } 

    public IEnumerable<SelectListItem> types { get; set; } 

    public ChargeCompanyModel ChargeCompany { get; set; } 

    public ChargeTypeModel ChargeType { get; set; } 
    } 
    } 


    namespace Charge.Controllers 
    { 
    public class ChargeController : Controller 
    { 
    [HttpGet] 
    public ActionResult Main() 
    { 
     var chargeEntities = new ChargeEntities(); 
     var sell = new SellChargeModel(); 
     var query = chargeEntities.ChargeCompanies.ToList(); 
     var listCompany = 
      query.Select(
       company => new SelectListItem {Text = company.Name, Value =       company.Id.ToString()}) 
       .ToList(); 
     sell.Companys = listCompany; 
     return View(sell); 
    } 

    [HttpPost] 
    public ActionResult Main(FormCollection form) 
    { 
     var id = Convert.ToInt32(form["Companys"]); 
     var chargeEntities = new ChargeEntities(); 
     var query = chargeEntities.ChargeTypes.Where(x => x.CompanyId == id).ToList(); 
     var chargeType = new SellChargeModel(); 
     var selectList = query.Select(x => new SelectListItem {Text = x.Type, Value = x.Id.ToString()}).ToList(); 
     chargeType.types = selectList; 
     return View(chargeType); 
    } 

    } 
    } 

    @model SellChargeModel 
    @using Charge.Models 
@{ 
ViewBag.Title = "Main"; 
} 

    <h2>Main</h2> 
    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "dForm" })) 
    { 
    <div> 
    @Html.DropDownListFor(x => x.Companys, Model.Companys, new {onchange =    "$('#dForm').submit()"}) 
</div> 
<br/> 
<br/> 
<br/> 
<br/> 
<br/> 
<div> 
    @foreach (var c in Model.types) 
    { 
     @Html.RadioButtonFor(x => x.ChargeType, c.Text, c.Value) 
     @Html.Label(c.Text) 
    } 
    </div> 

    } 
+0

什么的'ChargeEntities()的构造是如何做之前重新加载在该属性的数据;'什么样子的? – StanK 2012-04-02 22:55:35

回答

1

在你[HttpPost]动作你需要(通过使用chargeEntities.ChargeCompanies,然后将其映射到IEnumerable<SelectListItem>)来设置chargeType.Companys属性您在[HttpGet]动作做的方式相同。您需要这样做的原因是因为您正在重新显示您根据此属性显示下拉列表的相同视图。如果该属性为空,那么当您尝试显示DropDownList时,您会在视图中获取NRE。

+0

你是对的,但回发之前下拉完成我有这个错误 – Mohsen 2012-04-01 16:10:44

1

ASP.NET MCV没有ViewState。所以它不会保留你的数据在回传下拉菜单中。这是ASP.NET MVC的行为。您收到空错误的原因是因为您的后操作方法返回Companys属性为空的对象。你可能想返回它就像你在你的行动HTTPGET方法

+0

你是对的,但在回发下拉完成之前,我有这个错误 – Mohsen 2012-04-01 16:11:33

+0

@Mohsen:在你的HttpGet操作方法中使用断点,看看你是否作为公司重新调整为空 – Shyju 2012-04-01 16:13:42

+0

:在HttpGet行动中,公司不是空的。问题在于types.beacuse类型必须填写httppost动作并且httpget动作为空 – Mohsen 2012-04-01 16:22:00