1 asp.net-mvc model asp.net-mvc-3 drop-down-menu
几个星期以来,我一直在努力应该做一件非常简单的事情.我只是想在asp.net mvc 3 razor html页面中创建一个下拉列表,我希望下拉列表的数据来自模型.
我的模型如下所示,它位于Models.Project命名空间中.
public class Project
{
public Project()
{
CategoryId = 0;
Name = "";
Description = "";
//Categories = new Dictionary<int, string>();
Entities _db = new Entities(); //ef4
CateogoriesList = from c in _db.Categories
orderby c.Name
select c.Name;
}
public int CategoryId { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Project Name")]
public string Name { get; set; }
[Required]
[DataType(DataType.MultilineText)]
[Display(Name = "Project Description")]
public string Description { get; set; }
public IQueryable<string> CateogoriesList;
}
Run Code Online (Sandbox Code Playgroud)
我的控制器操作如下
public ActionResult Create()
{
Models.Project.Project proj = new Models.Project.Project();
return View(proj);
}
Run Code Online (Sandbox Code Playgroud)
我的Razor视图有以下相关代码......
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model Models.Project.Project
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<fieldset>
<legend>Submit Your Request</legend>
<div class="editor-label">@Html.LabelFor( Model => Model.CateogoriesList )</div>
<div class="editor-field">
@Html.DropDownList("Category", new SelectList( Model.CateogoriesList ) )
</div>
</fieldset>
<p><input type="submit" value="Send for RFP" /></p>
}
Run Code Online (Sandbox Code Playgroud)
问题是我收到以下错误...
Compiler Error Message: CS0135: 'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
我看到以下剪辑使它与ViewBag一起工作......我不明白为什么当我在模型中包含列表时它不起作用.
我也看到有很多人似乎在这个简单的任务中遇到了麻烦,但在我的谷歌上搜索...我没有遇到任何人在尝试创建下拉列表时遇到同样的错误.
我很感激您或任何人可能提出的任何建议.我唯一想到的是SelectList
构造函数接受一个类型的参数,System.Collections.IEnumerable
我试图传递的是S ystem.Collections.Generic.IEnumerable
...或接近它的东西......我不知道如何演员它恰当地......虽然我不认为我应该......如果它与一个视袋一起作为交通工具,为什么它不能用模型作为交通工具?
谢谢,
编辑:======================
问题在于selectList构造函数可以接受的对象类型.由于某种原因,它不会接受通用的IQueryable,但当我使用强制转换方法将实体框架的结果转换为Array时,它突然起作用.
所以我的模型变成......
公共类项目{public Project(){
Riebro.RiebroEntities _db = new Riebro.RiebroEntities();
CategoriesList = (from c in _db.Categories
orderby c.Name
select c.Name).ToArray<string>();
}
[Display(Name = "Choose a category")]
public string[] CategoriesList;
Run Code Online (Sandbox Code Playgroud)
}
请注意查询结束时的.ToArray然后突然
@Html.DropDownList("Category", new SelectList(Model.CategoriesList))
Run Code Online (Sandbox Code Playgroud)
作品.虽然我打算在这里指出Model关键字似乎是必需的.
在您的视图中,您使用:
@model Models.Project.Project
Run Code Online (Sandbox Code Playgroud)
而在您的控制器操作中,您通过:
public ActionResult Create()
{
Riebro.Models.Project.Project proj = new Riebro.Models.Project.Project();
return View(proj);
}
Run Code Online (Sandbox Code Playgroud)
请注意区别?Models.Project.Project
VS Riebro.Models.Project.Project
.您的控制器上似乎没有使用与视图相同的类型.
另请注意,使用包含类名称的命名空间名称是不好的做法.
另一个评论是在lambda表达式中使用Model关键字:
@Html.LabelFor(Model => Model.CateogoriesList)
Run Code Online (Sandbox Code Playgroud)
您不应该使用此关键字.用其他东西替换模型.
归档时间: |
|
查看次数: |
1508 次 |
最近记录: |