2009-04-12 9 views
2

私は学習プロジェクトとしてASP.NET MVCでTinyURLクローンを作成しようとしています。なぜこのフォームはASP.NET MVCでコントローラアクションを呼び出さないのですか?

今、私が望むのは、フォームを介して/ Home/Createアクションに新しいURLを送信できることだけです。

alt text

は、私は私のルーティングを設定している、私のLINQ式すべてのセットアップを持っている、と私は私のビューを設定しているが、何かが私の設定が間違っています。

ルーティング:

routes.MapRoute(
      "Default",            // Route name 
      "",       // URL with parameters 
      new { controller = "Home", action = "Index" } // Parameter defaults 
     ); 

routes.MapRoute(
      "Redirect", 
      "{hash}", 
      new { controller = "Home", action = "RequestLink", hash = "" } 
     ); 

これらのルートは、私は私のウェブサイト、www.tinyurlclone.com/に行くことができるようにと何も渡されない場合、TIは単に私のホーム/インデックス()アクションに行くことができます。ただし、スラッシュの後に何かを置くと、Link Hashとみなされ、ハッシュを取得しようとします。

次のように私にHomeControllerがある:

[HandleError] 
public class HomeController : Controller 
{ 
    TinyGetRepository repo = new TinyGetRepository(); 

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


    public ActionResult Create(String url) 
    { 
     String hash = repo.addLink(url); 
     ViewData["LinkHash"] = hash; 
     return View(); 
    } 

    public ActionResult RequestLink(String hash) 
    { 
     String url = repo.getLink(hash); 
     return Redirect(url); 

    } 
} 

私のレポクラスは、データベースを扱うためにそれにすべての私のLINQ式を持ち、それはこれに関連していないので、私は実際にそれらを含める必要はありません質問。

最後に、(URLを送信するために使用)私の基本的なホーム/インデックス()ビューは次のとおりです。私は提出クリックしたときしかし、私のフォームは、単に任意のメソッドを発射されていない

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Index</title> 
</head> 
<body> 
    <div> 
    <center> 
      <span style="font-size: 14pt">TinyGet <em>(beta)</em></span><br /> 
      <span style="font-family: Tahoma">Reduce your long links to smaller ones to keep them more memorable....<br /> 
      </span> 
      <% using(Html.BeginForm("Create", "Home")) %> 
      <% { %> 
      <%= Html.TextBox("url") %> 
      <input type="submit" name="submitButton" value="Shorten Link!" /> 
      <% } %> 

     </center> 
    </div> 
</body> 
</html> 

。私は生成されたHTMLのソースを表示する場合

さらに、私はそれが正しく私のフォームのアクションしなかったことを見ることができ、それは読む:

<form action="" method="post"><input id="url" name="url" type="text" value="" /> 
      <input type="submit" name="submitButton" value="Shorten Link!" /> 
      </form> 

はなぜアクションとして「」入れてHTMLヘルパーですそれは〜を置くべきであるとき/ホーム/作成?私の/ Home/Createアクションメソッドが呼び出されないのはなぜですか?私がHtmlヘルパーを使用せずに手動で<form>タグを指定しても、エラーが発生します。

ここで何が間違っていますか?プロジェクトの

出典:here

答えて

3

問題は、ルート値(controller = Home、action = Create)と一致するルートがないことです。

2つのルートがあります.1つは空の文字列(パラメータなし)で、Controller = "Home"、Action = "Index"と一致します。もう1つは、Controller = "Home"、Action = "RequestLink"と一致するハッシュルートです。したがって、ASPの場合。Net Routingはあなたが提供しているルート値からURLを構築するために使用され、({controller}と{action}のいずれのパラメータもないので)

この場合、最も簡単な解決策は、「ハッシュ」ルートを使用できるように、「作成」アクションへの直接ルートを作成することです。これをRegisterRoutesメソッドの一番上に置きます。注:注文と関係ありますか? ASP.Net Routingは、追加された順に各ルートが一致するまで各ルートをチェックします。

routes.MapRoute(
     "Create",            // Route name 
     "Create",       // URL with parameters 
     new { controller = "Home", action = "Create" } // Parameter defaults 
    ); 

あなたは「ハッシュ」路線という「ハッシュ」の値が有効を検討されるので、あなたが本当に、デフォルトの「{コントローラ}/{アクション}/{ID}」技術を使用することはできません持っているので、コントローラ名。したがって、誰かが要求した場合:http://www.mysite.com/fjhas82、MVCは "fjhas82"と呼ばれるコントローラを探し、見つからないと不平を言うでしょう。残念ながら、これは新しいコントローラアクションごとに新しいルートを手動で追加する必要があることを意味します(上記のように)。これは苦痛です。

私の意見では、Regex Constraintsを使用することです:あなたのハッシュが非常に明確なフォーマット(例えば、5文字の後に2つの数字、または "_"の後ろに英数字がある)など)、またはそのような形式を適用する場合は、ASP.NetルーティングでサポートされているRegex制約を使用できます。 「ホーム」、それが正規表現に一致していないことが判明、最初のルートをチェックします:次に、あなたはMVCのようなコントローラ名を見れば、これら二つの経路これらのルートの下

routes.MapRoute(
     "Redirect", 
     "{hash}", 
     new { controller = "Home", action = "RequestLink" }, 
     new { hash = @"[a-zA-Z]{5}[0-9]{2}" } // Regex Constraints 
    ); 

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index" } // Parameter defaults 
);  

のみを必要とするだろう、次のものに移動します。注:私の正規表現の構文は少し錆びているかもしれませんので、最初にRegexをテストし、ハッシュとコントローラの名前で動作することを確認するためにhttp://regexpal.com/のようなものを使用します。

私はたくさん書いたことが分かりますが、MVCは非常に柔軟性があり、さまざまな方法で作業を行うことができます。

0

私が学んだことから、同様の問題は、ルーティングは、最後のルート

をとるれるように、そのあなたのハッシュルートを使用して代わりに、そのため、その「は」

を入れていました

基本的にあなたがそのハッシュルートを取り除くことができ、ちょうどそれは同じことを達成するでしょう。この

routes.MapRoute(   "Default",            // Route name   "{controller}/{action}/{hash}",       // URL with parameters   new { controller = "Home", action = "Index", hash="" } // Parameter defaults  ); 

を持っており、ハッシュは提供されません。

+0

しかし、www.mysite.com/hashgoeshereと入力できるようにするにはどうすればよいですか。 – Mithrax

+0

、つまりwww.mysite.com/fghas82 – Mithrax

+0

でも動作します – dswatik

関連する問題