0

我正在自学asp .net mvc3。我有一个“添加属性”表单,允许用户将属性详细信息上传到网站。我已经为这个错误苦苦挣扎了很长时间。

为简化起见,假设我的数据库中有两个表。

CustomerTypes:数据库有 1 个所有者、2 个代理、3 个商业等属性:这是由表单填充的表。

我使用 CustomerTypes(和其他此类表)来创建单选按钮。用户填写表格并选择“客户类型”选项。但是,我在提交时收到“对象引用未设置为对象的实例”错误。这是因为为 Model.CustomerTypes 设置了“null”。但是,Model.CustomerTypes 仅用于创建单选按钮。我不确定出了什么问题。代码如下:

看法:

@model Website.ViewModels.AddPropertyViewModel

<fieldset>
    <legend>Property</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Property.CustomerType)
        @foreach (var item in Model.CustomerTypes)
        {
            @Html.RadioButtonFor(model => model.Property.CustomerType, Convert.ToInt32(item.Value)) @item.Text
        }
    </div>

    ...

添加属性视图模型:

namespace Website.ViewModels
{
    public class AddPropertyViewModel
    {
        public Property Property { get; set; }
        ...

        public IEnumerable<SelectListItem> CustomerTypes { get; set; }
        ...
    }

控制器:

public ActionResult AddProperty()
    {
        AddPropertyViewModel viewModel = new AddPropertyViewModel
        {
                ...
            CustomerTypes = websiterepository.GetCustomerTypeSelectList(),
                ...
        };
        return View(viewModel);

GetCustomerTypeSelectList 函数是:

public IEnumerable<SelectListItem> GetCustomerTypeSelectList()
{
    var customerTypes = from p in db.CustomerType
                            orderby p.CustomerTypeDescription
                            select new SelectListItem
                            {
                                Text = p.CustomerTypeDescription,
                                Value = SqlFunctions.StringConvert((double)p.CustomerTypeId)
                            };
    return customerTypes;
}

POST 中的值根据选择正确设置为 Property_CustomerType

--- 添加了更多信息 --- 我将表格开头为:

@using (Html.BeginForm("AddProperty", "Property", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
...
}

控制器是:

[HttpPost]
public ActionResult AddProperty(AddPropertyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // 
        if (viewModel.File1.ContentLength > 0)
        {
            var fileName = Path.GetFileName(viewModel.File1.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
            viewModel.File1.SaveAs(path);
        }

        var property = viewModel.Property;
        websiterepository.Add(property);
        return RedirectToAction("Index", "Home");
    }

    return View(viewModel);
}

这是错误的屏幕截图: 在此处输入图像描述

我已经尝试提交评论这些单选按钮的表单并且它有效。

4

1 回答 1

1

问题是CustomerTypes在发布到服务器后渲染视图时没有填充。

如果我们查看正在执行的操作流程,我们会看到

  1. CustomerTypes在呈现初始页面之前填充集合
  2. 您将数据发布回服务器但不保留CustomerTypes集合(因为没有必要)
  3. 您再次渲染视图,但这次没有填充 CustomerTypes.
  4. 轰隆隆!

在第二次返回视图之前填充 CustomerTypes 属性应该可以解决您的问题:

[HttpPost]
public ActionResult AddProperty(AddPropertyViewModel viewModel)
{
 [...]

 viewModel.CustomerTypes = websiterepository.GetCustomerTypeSelectList();

 return View(viewModel);
}
于 2012-09-23T08:23:30.060 回答