24

私はここで何か間違ったことをしていると確信しています。過去 2 か月間、MVC と Razor を使用して Web アプリを開発してきましたが、フォーム要素を使用することは考えもしませんでした。マスターページとサブページですでに多くのことが行われているため、フォーム要素を使用するためにほとんどのコードを再構築する必要があり、ページ上に複数のフォーム要素が発生します。

それはさておき、Asp.Net では、C# コード ビハインドの任意のコントロールにアクセスしたい場合は、ID="SomeID" と RUNAT="SERVER" を指定するだけで済みます。次に、コード ビハインドで、その値とプロパティを設定できます。

Razor でこれを行う場合、次のような行を使用します。

 <input id="hiddenPostBack" runat="server" type="hidden" />

コントローラーでこれにアクセスできないのはなぜですか? ポストバックを検出し、ページが初めて読み込まれる場合は値を false に設定し、そうでない場合は値を true に設定したいと考えています。次に、これに基づいて、サーバー側またはクライアント側のいずれかで読み取り、何かを実行します。

私の本当の質問は、フォーム要素がない場合、サーバー側とクライアント側の両方で「何かをする」にはどうすればよいかということです。クライアントからサーバーに値を渡したり戻したりしたい場合、これを行う最も簡単な方法は隠し入力を使用することだという印象を受けました。しかし、MVC3 とカミソリでこれを達成する方法がわかりません。

よろしくお願いします。

4

5 に答える 5

40

WebForms から MVC への移行には、ロジックと脳のプロセスの完全な大転換が必要です。サーバー側とクライアント側の両方で「フォーム」と対話することはなくなりました (実際、クライアント側と対話していなかった WebForms でも)。おそらく、WebForms を使用して、単にWeb ページの作成と対話RUNAT="SERVER"しているだけで、ちょっとした考えを混同しただけでしょう。

MVC は、モデル (ユーザーに表示されるものを構築するために必要なデータ) を構築する際にサーバー側のコードがあるという点で多少似ていますが、HTML を構築したら、サーバーとユーザーの間のリンクを理解する必要があります。もはや存在しない。彼らは HTML のページを持っています。それだけです。

したがって、作成している HTML は読み取り専用です。モデルを Razor ページに渡すと、そのモデルに適した HTML が作成されます。

これが最初のビューであるかどうかに応じて true または false を設定する隠し要素が必要な場合は、モデルに bool が必要であり、フォローアップに応答する場合は Action で True に設定します。これは、リクエストが [HttpGet] であるか [HttpPost] であるかに応じて異なるアクションを実行することで実行できます (フォームの設定方法に適している場合: 最初のアクセスでは GET リクエスト、フォームを送信する場合は POST リクエスト)。

または、モデルが作成されたとき (初めてページにアクセスするとき) にモデルを True に設定することもできますが、値が True または False であることを確認した(bool はインスタンス化されたときにデフォルトで False になるため)。次に使用:

@Html.HiddenFor(x => x.HiddenPostBack)

これにより、非表示の True が配置されます。フォームがサーバーにポストバックされると、モデルの値が True に設定されます。

あなたの質問は、なぜこれをしたいのかについて具体的ではないので、それ以上のアドバイスをするのは難しいです. Steve Sanderson の Pro ASP.NET MVC など、WebForms から MVC への移行に関する優れた本を読むことはおそらく重要です。

于 2012-07-04T09:10:36.473 に答える
10

Razor を使用している場合、フィールドに直接アクセスすることはできませんが、その値を管理することはできます。

Microsoft の最初のアプローチは、開発者を Web 開発から遠ざけ、(たとえば) デスクトップ プログラマーが Web アプリケーションを簡単に作成できるようにするという考えです。

一方、Web 開発者は、ASP.NET のこのトリッキーで奇妙な方法を理解していませんでした。

実際には、この非表示の入力はクライアント側でレンダリングされ、ASP はそれにアクセスできません (アクセスしたことはありません)。しかし、やがてそれが海賊行為であることがわかり、慣れてきたらそれに頼ることができるようになります。Web 開発は、デスクトップやモバイルとは異なります。

モデルは論理単位であり、非表示フィールド (およびビュー ページ全体) はデータの代表的なビューにすぎません。そのため、アプリケーションまたはドメイン ロジックに作業を専念させることができ、ビューはそれを消費者に提供するだけです。つまり、ビューでの詳細なアクセスや「ブレインストーミング」機能は必要ありません。

コントローラーは、非表示または一般的なセットアップを管理するために必要な機能を実際に実行します。モデルは特定の論理ユニットのプロパティと機能を提供し、ビューはそれをエンド ユーザーにレンダリングするだけです。MVCの詳細をお読みください。

モデル

public class MyClassModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string MyPropertyForHidden { get; set; }
}

これはコントローラーアクションです

public ActionResult MyPageView()
{
    MyClassModel model = new MyClassModel(); // Single entity, strongly-typed
    // IList model = new List<MyClassModel>(); // or List, strongly-typed
    // ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag

    return View(model);
}

ビューは以下です

//This will make a Model property of the View to be of MyClassModel
@model MyNamespace.Models.MyClassModel // strongly-typed view
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view

// ... Some Other Code ...

@using(Html.BeginForm()) // Creates <form>
{
    // Renders hidden field for your model property (strongly-typed)
    // The field rendered to server your model property (Address, Phone, etc.)
    Html.HiddenFor(model => Model.MyPropertyForHidden); 

    // For list you may use foreach on Model
    // foreach(var item in Model) or foreach(MyClassModel item in Model)
}

// ... Some Other Code ...

ViewBag を使用したビュー:

// ... Some Other Code ...

@using(Html.BeginForm()) // Creates <form>
{
    Html.Hidden(
        "HiddenName",
        ViewBag.MyHiddenInputValue,
        new { @class = "hiddencss", maxlength = 255 /*, etc... */ }
    );
}

// ... Some Other Code ...

Html Helper を使用して Hidden フィールドをレンダリングするか、手動で記述することもできます<input name=".." id=".." value="ViewBag.MyHiddenInputValue">

ViewBag は、ビューに対するある種のデータ キャリアです。モデルに制限はありません。好きなものを配置できます。

于 2012-07-04T09:41:51.783 に答える
1

すでに理解しているかもしれませんが、Asp.Net MVCはAsp.Net(Webフォーム)とは異なるパラダイムです。サーバーとクライアント間のフォーム要素へのアクセスは、Asp.NetMVCでは異なるアプローチを取ります。

あなたはウェブ上でこれに関するより多くの読み物をグーグルで検索することができます。今のところ、Ajaxを使用してデータを取得またはサーバーに投稿することをお勧めします。を使用することもできますが、またはRazorinput type="hidden"の値で初期化します。ViewDataViewBag

たとえば、コントローラは次のようになります。

public ActionResult Index()
{
     ViewBag.MyInitialValue = true;
     return View();
} 

ビューでは、:の値によって初期化される入力要素を持つことができますViewBag

<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" />

次に、ajaxを介してクライアントとサーバー間でデータを渡すことができます。たとえば、jQueryを使用します。

$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) {
   // blah
});

代わりに、要件に応じて、を$.ajax使用することもできます。$.getJSON$.post

于 2012-07-04T09:09:23.383 に答える
0

まず第一に、ASP.NET MVC は WebForms と同じようには機能しません。あなたはすべてを持っていませんrunat="server"。MVC は、WebForms が提供した抽象化レイヤーを提供しません。おそらく、コントローラーとアクションが何であるかを理解しようとする必要があります。次に、モデルバインディングを検討する必要があります。MVC に関する初心者レベルのチュートリアルでは、クライアントとサーバーの間でデータを渡す方法が示されています。

于 2012-07-04T09:04:20.877 に答える
-1

MVCアプリケーションでWebFormsをマップしようとしているため、間違っています。

MVCにはサーバー側のコントロールはありません。バックエンドのビューコントローラーのみ。モデルを使用してビューを初期化することにより、サーバーからクライアントにデータを送信します。

これは、リソースへのHTTPGETリクエストで発生しています。

[HttpGet]
public ActionResult Home() 
{
  var model = new HomeModel { Greeatings = "Hi" };
  return View(model);
}

データをサーバーに転記することにより、クライアントからサーバーにデータを送信します。これを実現するには、ビュー内にフォームを作成 [HttpPost]し、コントローラーのハンドラーを作成します。

// View

@using (Html.BeginForm()) {
  @Html.TextBoxFor(m => m.Name)
  @Html.TextBoxFor(m => m.Password)
}

// Controller

[HttpPost]
public ActionResult Home(LoginModel model) 
{
  // do auth.. and stuff
  return Redirect();
}
于 2012-07-04T09:09:07.003 に答える