すべてのビューのためのパブリックメソッド?デフォルトのActionResultとASP.MVC内のルート

StackOverflow https://stackoverflow.com/questions/671561

  •  21-08-2019
  •  | 
  •  

質問

私はASP.NET MVCとルートを試しています。

MVCコントローラに私はビューを作成したい任意の時間にパブリックメソッドを追加するために私を強制的に表示されます。たとえばます:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    //... a public method for every view.. :(
}

私はすべてのビューのためのパブリックメソッドを作成する必要はありません。デフォルトでは、私は、特に指定がない限り、システム内のすべてのビューは、「ビュー()を返す」の振る舞いをします。

たとえば、HTTP GETます:

site.com/about
site.com/features
site.com/
site.com/testimonials
site.com/contact-us

それが今立っているように、私は追加する必要があります。

HomeController.About()
HomeController.Features()
HomeController.Index()
HomeController.Testimonials()
HomeController.ContactUs()

のすべての結果は、 "ビュー()を返します"。これは私が、単純なビューのパブリック・アクション・メソッドを作成排除しようとしています、私の問題です。

追加の処理を必要とするビューの場合、HTTPのPOSTでのお問い合わせページのように:

site.com/contact-us

私は、具体的にSMTPメッセージを送信するために、コントローラにメソッドを追加したいと思います。

<時間>

以下は、私がやろうとしています何のより簡潔な例です。

public class HomeController{

   public ActionResult ShowBasicView(){
     //HTTP GET:
     //site.com/about
     //site.com/features
     //site.com/
     //site.com/testimonials

     //All URLs above map to this action

     return View();
   }

   [AcceptVerbs(HttpVerbs.Post)]
   public ActionResult ContactUs(FormCollection data){

     //HTTP POST:
     //site.com/contact-us

     //POST URL maps here.

     SmtpClient.Send(new MailMessage()) //etc...
     return View()
   }

}

おかげで、 ブライアン

役に立ちましたか?

解決

あなたの編集からShowBasicViewを有する潜在的な問題は、ビューの暗黙の配線に、それらのURLのそれぞれは、すべて、すなわち、同じビューを返すということです

  

ビュー\ \ホーム\ ShowBasicView.aspx

それはおそらくそうだが、さて、これは、あなたが望むものかもしれません。

あなたは、おそらくのようなルートを持っていることによって、これを設定することができ

routes.MapRoute(  
  "ShowBasic",
  "{id}",
  new { controller = "Home", action = "ShowBasicView", id = "home" }
);

そして、あなたにコントローラーを変更します。

public class HomeController: Controller{

  public ActionResult ShowBasicView(string pageName){
    // Do something here to get the page data from the Model, 
    // and pass it into the ViewData
    ViewData.Model = GetContent(pageName);

    // All URLs above map to this action
    return View();
  }
}

また、コンテンツはビューにハードコードされている場合、あなたが試みることができる:

public class HomeController: Controller{

  public ActionResult ShowBasicView(string pageName){
    // All URLs above map to this action
    // Pass the page name to the view method to call that view.        
    return View(pageName);
  }
}

あなたは、おそらくまた、文字列値を持つURLのみにヒットするShowBasicルートとして、ベースURLのためにルートを追加する必要があります。

他のヒント

あなたはあなたのコントローラで次のメソッドを追加することができ、それ

protected override void HandleUnknownAction(string actionName)
{
    try{
       this.View(actionName).ExecuteResult(this.ControllerContext);
    }catch(Exception ex){
       // log exception...
       base.HandleUnknownAction(actionName);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top