0

我正在尝试在 MVC4 中制作一个简单的新闻系统。我对此很陌生,我有一个简单的 News 基类,如下所示:

新闻邮报:

public class NewsPost
{
    public virtual int Id { get; set; }
    public virtual string Subject { get; set; }
    public virtual string Content { get; set; }
}

然后将其附加到一个类别类,如下所示:

新闻分类

public class NewsCategory
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<NewsPost> NewsPosts { get; set; }
}

然后我有一个用于创建这些 NewsPosts 的控制器:

新闻控制器

private readonly INewMvcSiteDataSource _db;

public NewsController(INewMvcSiteDataSource db)
{
    _db = db;
}

[HttpGet]
public ActionResult Create()
{
    var model = new CreateNewsViewModel();

    model.Categories = new SelectList(_db.NewsCategories, "Id", "Name");

    return View(model);
}

[HttpPost]
public ActionResult Create(CreateNewsViewModel newsModel)
{
    if (ModelState.IsValid)
    {
        int id = int.Parse(newsModel.SelectedCategories.Single(f => f.Selected).Value);
    }
    return View(newsModel);
}

最后,为了方便创建 NewsPost,我使用了 CreateNewsViewModel,如下所示:

创建新闻视图模型

public class CreateNewsViewModel
{
    [Required]
    public string Subject { get; set; }

    [Required]
    public string Content { get; set; }

    public SelectList Categories { get; set; }
    public SelectList SelectedCategories { get; set; }
}

我的观点是这样的:

创建.cshtml

@model NewMvcSite.Models.CreateNewsViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>CreateNewsViewModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Subject)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Subject)
            @Html.ValidationMessageFor(model => model.Subject)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Content)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Content)
            @Html.ValidationMessageFor(model => model.Content)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Categories)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Categories, Model.SelectedCategories)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

出于某种原因,当我单击提交按钮创建新闻帖子时,我的视图模型没有返回,并且由于 [HttpPost] 创建操作没有无参数构造函数,因此它失败并显示“没有为此对象定义无参数构造函数”。

我一直在尝试浏览其他帖子,说明同样的问题,但我看不到他们在做什么和我在做什么之间的联系。我希望那里有人可以帮助我。

谢谢你。

4

3 回答 3

1

如果要从下拉列表中选择类别,首先您应该向模型添加属性以保存所选类别的 Id。像这样的东西(属性类别):

public class CreateNewsViewModel
    {
        [Required]
        public string Subject { get; set; }

        [Required]
        public string Content { get; set; }

        public SelectList Categories { get; set; }
        public SelectList SelectedCategories { get; set; }
        public int Category { get; set; }
    }

之后,您应该将代码更改为填充模型。类别为:

model.Categories = new SelectList(categories, "Id", "Name", model.Category);

而且,在您看来,类别的编辑器应该如下所示:

    <div class="editor-field">
                @Html.DropDownListFor(m => m.Category, Model.Categories);


 </div>

于 2013-01-28T15:14:35.020 回答
0
model.Categories = new SelectList(_db.NewsCategories, "Id", "Name");

在这一行,您填写Categories属性

@Html.DropDownListFor(model => model.Categories, Model.SelectedCategories)

在这里您尝试select使用Categories名称和SelectedCategories项目创建

int id = int.Parse(newsModel.SelectedCategories.Single(f => f.Selected).Value);

在这里,您尝试获取选定的项目,但在提交表单时您只发送一个号码,而不是列表。你的一个SelectList必须是int

于 2013-01-28T14:48:57.100 回答
0

我找到了解决方案。

我不得不将 ViewModel 更改为:

public IEnumerable<SelectListItem> Categories { get; set; }
public int SelectedCategoryId { get; set; }

我将控制器更改为:

var model = new CreateNewsViewModel
                {
                    Categories = new SelectList(_db.NewsCategories, "Id", "Name")
                };

并将视图更改为:

@Html.DropDownListFor(x => x.SelectedCategoryId, Model.Categories)
于 2013-01-28T22:42:48.580 回答