2009-03-22 6 views
1

私はASP.NET MVCとRouteを試しています。すべてのビューのパブリックメソッド?デフォルトのActionResultとRoutes in ASP.MVC

MVCでは、ビューを作成するときはいつでも、コントローラにパブリックメソッドを追加するように見えます。例:

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

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

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

すべてのビューに対してパブリックメソッドを作成したくありません。デフォルトでは、特に指定がない限り、システム内のすべてのビューに対して「return 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() 
    } 

} 

おかげで、 ブライアン

答えて

3

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

をビュー\ \ Home \ 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に対してのみヒットします。

+0

私はこれを試しましたが、すべてのリクエストでpageNameがnullです。 site.com/とsite.com/aboutをrootにする。 –

+0

それを得ました!ありがとう!美しく動作します。 –

+0

{id}を{pageName}に変更するだけでroute.MapRoute()で動作します –

0

私は私はあなたの質問を理解していませんか?これはスタンダードルーティングではありませんか?ルート内の{action}を省略し、特定のケースのデフォルトにハードコードしますか?

http://www.asp.net/learn/mvc/tutorial-23-cs.aspx

+0

更新質問に次のメソッドを追加することができ、うまくいけばそれは私がやろうとしているかについての詳細は明らかです。 –

0

あなたはあなたのコントローラ、それ

protected override void HandleUnknownAction(string actionName) 
{ 
    try{ 
     this.View(actionName).ExecuteResult(this.ControllerContext); 
    }catch(Exception ex){ 
     // log exception... 
     base.HandleUnknownAction(actionName); 
    } 
} 
関連する問題