ラベル MVC の投稿を表示しています。 すべての投稿を表示
ラベル MVC の投稿を表示しています。 すべての投稿を表示

2018年4月21日土曜日

ASP.NET MVC で URL からコントローラー名を隠す

2018/04/23 追記
ふと、属性ルーティングで済むのではないかと思い、試してみました。結果、うまくいきました。

RegisterRoutes 内で、MapMvcAttributeRoutes を呼び出します。デフォルトで定義されている MapRoute は、必要がなければ削除(コメントアウト)します。
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //属性ルーティングの有効化
        routes.MapMvcAttributeRoutes();

        //"Home" や "Home/Index" にアクセスする必要がなければ削除
        //routes.MapRoute(
        //    name: "Default",
        //    url: "{controller}/{action}/{id}",
        //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        //);
    }
}

続いて、ルート属性を利用して、指定します。ルートの ”/”、”/Articles”、”/Articles/Index” で Index アクションにアクセスできるように属性を 3 つ設定しています。
public class ArticlesController : Controller
{
    [Route("~/")]
    [Route("Articles")]
    [Route("Articles/Index")]
    public ActionResult Index()
    {
        return View();
    }
}

しかも、最初に参照していた stackoverflow のスレッドにも、この属性ルーティングの方法が提案されていました。よく読みましょう... (^^;)
https://stackoverflow.com/a/39948890


2018/04/22
タイトルのままです。ASP.NET MVC で URL からコントローラー名を隠す方法を調べてみました。結果、ルーティングを設定することで解決しました。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        //MyRoute を追加。コントローラー名を指定していないリクエストは、Articles コントローラーで捕捉
        routes.MapRoute(
            "MyRoute",
            "{action}/{id}",
            new
            {
                controller = "Articles",
                action = "Index",
                id = UrlParameter.Optional
            }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

参考:ASP.NET MVC - Removing controller name from URL
https://stackoverflow.com/questions/3337372/asp-net-mvc-removing-controller-name-from-url

2017年2月12日日曜日

ASP.NET MVC ビューにクラスインスタンスを渡す際のエラー(InvalidOperationException)

2つのモデルを結合したモデルを表示しようとしたところ、こんなエラーが出ました。

--------エラーここから--------

'/' アプリケーションでサーバー エラーが発生しました。

ディクショナリに型 'System.Collections.Generic.List`1[WordLearner.Models.WordDetail]' のモデル項目が渡されましたが、このディクショナリには型 'WordLearner.Models.WordDetail' のモデル項目が必要です。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.InvalidOperationException: ディクショナリに型 'System.Collections.Generic.List`1[WordLearner.Models.WordDetail]' のモデル項目が渡されましたが、このディクショナリには型 'WordLearner.Models.WordDetail' のモデル項目が必要です。

--------エラーここまで--------

調べてみると同じエラーで困っている人がいました。
Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`1[]' using linq lambda expression
http://stackoverflow.com/a/22918838

そして回答も掲載されていました。今回検索結果のオブジェクトをビューに返すところを、クエリの状態でビューに渡しているのが原因でした💨
変数 query に FirstOrDefault() メソッドでオブジェクトを取得することで解決しました。

public ActionResult Test(int? id)
{
  if (id == null)
  {
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
  }
  Word word = db.Word.Find(id);
  if (word == null)
  {
      return HttpNotFound();
  }

  int _id = id.Value;
  var meaning = db.Meanings;
  var query = from x in db.Word
            join y in meaning on x.ID equals y.WordID
            where x.ID.Equals(_id)
            select new WordDetail
            {
                ID = x.ID,
                Spelling = x.Spelling,
                Meaning = y.Meaning
            };

  return View("Details", query.FirstOrDefault());
}

2013年8月24日土曜日

C# で JSON を扱う JSonConvert の名前空間

Newtonsoft.Json DLLC# で JSON を扱う JSonConvert 名前空間は、Newtonsoft.Json DLL に含まれています。
Newtonsoft.Json DLLNuGet から "Newtonsoft.Json" で検索して表示される "Json.NET" を追加すると自動的にプロジェクトに参照が追加されます。
Newtonsoft.Json DLL

2013年5月18日土曜日

ASP.NET MVC JSON データをコントローラーアクションに渡す

ASP.NET MVC で View(クライアント側)にある JSON データをコントローラーに渡す実装例です。
もっと簡潔な実装方法があると思いますが、動いたのでメモしておきます。

View
<script type="text/javascript">
<!--
    $(document).ready(function () {
        $("#button1").click(function () {

            var data = [
             { "name": "こぶた", "age": 3 },
             { "name": "たぬき", "age": 7 },
             { "name": "きつね", "age": 5 }
            ];

            var URL = "/Home/AnimalAction?animals=" + JSON.stringify(data);

            $.ajax({
                type: "POST",
                dataType: "json",
                url: URL,
            });
        });
    });
// -->
</script>

<input class="button" id="button1" type="button" value="JSON をコントローラーに渡す" />

コントローラー
public class HomeController : Controller
{

    ...

    public ActionResult AnimalAction(string animals)
    {
        // 引数 animals は JSON データ
        return View();
    }
}

今回は JSON をアクションへ渡すところまでの実装です。コントローラーで JSON データを扱うのはまた別の機会に(^_^;)

2013年5月17日金曜日

ASP.NET MVC3 と MVC4 の共存


ASP.NET MVC 4 がインストールされている状態で ASP.NET MVC 3 のプロジェクトを実行しようとすると、参照エラーのためプロジェクト実行に失敗します。
以下のように Web.config と プロジェクトファイルの設定を変更することで、ASP.NET MVC 3 のプロジェクトを実行することができるようになります。

Web.config
<appSettings>
    <add key="webpages:Version" value="1.0.0.0"/><!-- 追加 -->
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>


Application の csproj
<ItemGroup>
    <!-- コメントアウト -->
    <!--<reference Include="System.Web.WebPages" />
    <reference Include="System.Web.Helpers" />-->
    <!-- 以下のように変更 -->
    <reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL     "/>
    <reference Include="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
</ItemGroup>


参考情報

ASP.NET MVC 4
http://www.asp.net/whitepapers/mvc4-release-notes
→ Known Issues and Breaking Changes

2013年4月21日日曜日

ASP.NET MVC 変数を使う

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // コントローラー側での変数初期化
        ViewBag.Message = "メッセージ";
 
        return View();
    }
}

@*変数の初期化*@
@{
    ViewBag.Title = "テストページ";
    var number = 123;
    var razorVar = "Razor で変数";
}
 
@*変数の参照*@
@ViewBag.Message

@ViewBag.Title

@number

@razorVar