ASP.NET MVC控制器参数可选(即Index(int?id))

Tom*_*man 9 asp.net asp.net-mvc controller

我有以下场景:我的网站显示文章(由管理员输入,如博客).

因此,要查看文章,请将用户引用到Home/Articles/{article ID}.

但是,用户使用jsTree列表从Articles.aspx视图本身中选择要查看的文章.

所以我需要做的是能够区分两种情况:用户正在访问特定文章,或者他只是试图访问"主要"文章页面.我尝试将"Articles"控制器参数设置为可选(int?id),但后来我在控制器中"使用"id值时出现问题.

处理此方案的最佳方式是什么?也许我只需要一个更好的逻辑来检查"url"中是否提供了id参数?

我试图避免使用两个视图/控制器,只是出于代码复制的原因.

egl*_*ius 14

使用单独的操作,例如:

public ActionResult Articles() ...
public ActionResult Article(int id) ...
Run Code Online (Sandbox Code Playgroud)

或者将其移动到Articles控制器(使用默认路由的URL将是:ArticlesArticles/Detail/{id}):

public class ArticlesController : Controller
{
    public ActionResult Index() ...
    public ActionResult Detail(int id) ...
}
Run Code Online (Sandbox Code Playgroud)

如果您仍然必须像发布的那样使用它,请尝试以下方法之一:

public ActionResult Articles(int id = 0)
{
     if(id == 0) {
         return View(GetArticlesSummaries());
     }
     return View("Article", GetArticle(id));
}
public ActionResult Articles(int? id)
{
     if(id == null) {
         return View(GetArticlesSummaries());
     }
     return View("Article", GetArticle(id.Value));
}
Run Code Online (Sandbox Code Playgroud)


bas*_*ijn 7

首先,我同意@Steve :).但如果你真的想用

int? id
Run Code Online (Sandbox Code Playgroud)

如果使用简单设置id,您可以检查控制器方法

if(id == null)
Run Code Online (Sandbox Code Playgroud)

如果是这样,请从您的数据库(或类似的东西)加载所有文章,并将这些文章传递给您的视图(直接或使用视图模型).如果设置了id,你只需从数据库加载具有该id的文章并将其发送到视图(如果你不使用视图模型,也可以在列表中)?

在您的视图中,只需使用提供给视图的文章加载列表中的所有文章.其中包含全部或仅包含一个.

完整的虚拟代码

public ActionResult showArticles(int? id){
   List<Articles> aList;
   if(id == null){
       aList = repository.GetAllArticles().ToList();
   }else{
      aList = new List<Articles>(); 
      aList.add(repository.GetArticleByID(id));
   }

   return View(aList);
}
Run Code Online (Sandbox Code Playgroud)

您的视图具有以下内容:

<% Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<List<Articles>>"%>

foreach(Articles a in Model)
    //display article
Run Code Online (Sandbox Code Playgroud)

然后使用以下两个选项之一调用它:

html.ActionLink("one article","showArticles","Articles",new {id = aID},null}

html.ActionLink("all articles","showArticles","Articles"}
Run Code Online (Sandbox Code Playgroud)


Cli*_*ity 5

为您知道没有提供任何值的ID定义默认值 - 通常为0.

public ActionResult Articles([DefaultValue(0)]int Id)
{
  if (Id == 0)
    // show all
  else
    // show selected
..
Run Code Online (Sandbox Code Playgroud)