我在视图中有以下代码:
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
<%= Html.ListBox("MultiSelectList",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
Run Code Online (Sandbox Code Playgroud)
唯一的区别是第一个帮助器是强类型的(ListBoxFor),并且它无法显示所选项(1,2),即使项目出现在列表中,等等.更简单的ListBox正在按预期工作.
我显然在这里遗漏了一些东西.我可以使用第二种方法,但这真的让我烦恼,我想弄清楚.
作为参考,我的模型是:
public class ProjectEditModel
{
public Project Project { get; set; }
public IEnumerable<Project> Projects { get; set; }
public IEnumerable<Client> Clients { get; set; }
public IEnumerable<Category> Categories { get; set; }
public IEnumerable<Tag> Tags { get; set; }
public ProjectSlide SelectedSlide { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望网址比/ {Controller}/{Action}/{Id}更短.
例如,我想{Controller}/{Id},其中{Id}是一个字符串.
这将允许简单的路径,例如用户/用户名,页面/页面名称,新闻/新闻名称.我比在URL(用户/详细信息/用户名)中要求/ Details操作更好,这对最终用户来说不那么优雅.
我可以通过为任何我想要这种简单程度的控制器设置自定义路由来轻松完成这项工作.但是,这会导致实现其他操作时出现麻烦,例如{Controller}/{Action},其中{Action} ='Create',因为在这种情况下,字符串{Action}与字符串{Id}冲突.
我的问题:我怎么能有'保留'字样,所以如果URL是/ News/Create,它被视为一个动作,但如果URL是其他任何东西,例如/ News/A-gorilla-ate-my-论文,然后它被视为Id.
我希望在设置路线时可以定义这个?
使用Ben Griswold的答案,我已将默认的ASP.NET MVC路由更新为:
routes.MapRoute(
"CreateRoute", // route name
"{controller}/Create", // url with parameters
new { action = "Create" } // parameter defaults
);
routes.MapRoute(
"DetailsRoute", // route name
"{controller}/{id}", // url with parameters
new { action = "Details" } // parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults …Run Code Online (Sandbox Code Playgroud) 我的设置:
/Pages/Details/2<% Html.RenderAction("CreatePageComment", "Comments"); %>呈现注释表单Comments/CreatePageComment/Comments/CreatePageCommentRedirectToAction成功创建注释时返回我的问题:
如果存在验证错误,我应该如何返回/Pages/Detail/1并在评论表单中显示错误?
RedirectToAction,似乎验证是棘手的; 我是否应该使用Post-Redirect-Get模式进行验证错误,而不仅仅是返回?View()它会让我回到显示CreateComment.aspx视图(通过验证,但只是白页上的表单),而不是/Pages/Details/2调用的路径RenderAction.如果应该使用PRG模式,那么我认为我只需要学习如何在使用PRG时进行验证.如果没有 - 对我来说这似乎更好地通过返回处理View()- 然后我不知道如何让用户返回到初始视图,显示表单错误,同时使用RenderAction.
这感觉就像你敲击你的头并同时揉肚子的游戏.我也不擅长那个.我是MVC的新手,所以这可能是问题所在.