1

ASP.NETMVCとルートを試しています。

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

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

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

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

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

たとえば、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()

すべて「returnView()」になります。これが私の問題です。単純なビューのパブリックアクションメソッドの作成を排除しようとしています。

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()
   }

}

ありがとう、ブライアン

4

2 に答える 2

3

編集から ShowBasicView を取得する際の潜在的な問題は、ビューの暗黙的な接続により、これらの各 URL がすべて同じビューを返すことです。つまり、次のようになります。

\Views\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);
  }
}

ShowBasic ルートは文字列値を持つ URL に対してのみヒットするため、ベース URL のルートも追加する必要がある場合があります。

于 2009-03-22T21:51:37.373 に答える
0

コントローラーに次のメソッドを追加できます。

protected override void HandleUnknownAction(string actionName)
{
    try{
       this.View(actionName).ExecuteResult(this.ControllerContext);
    }catch(Exception ex){
       // log exception...
       base.HandleUnknownAction(actionName);
    }
}
于 2013-02-04T12:18:05.897 に答える