4

これは、ここに投稿された最初の質問です。不足しているものがあればご容赦ください。リクエストされた情報で更新します。

説明

私は最初の C#.Net MVC-3 アプリケーションに取り組んでいます。Entity Framework 4.0 と Razor ビュー エンジンを使用しています。

ほとんどのビューでは、部分クラスのインスタンスを含むビュー モデルを使用します。その部分クラスは EF クラスから派生し、それらのクラス メンバーのデータ注釈を含みます。これは非常にうまく機能し、そのビュー モデルを使用するすべてのビューで、影響を受けるテキスト ボックスの検証が行われるようになりました。例:

部分クラス:

[MetadataType(typeof(DataPackageMetaData))]
public partial class DataPackage
{
    //empty
}

public class DataPackageMetaData
{
    [Required]
    [StringLength(50)]
    public string DataPackageID { get; set; }

    ... (a lot more stuff like this) ...
}

ビューモデル:

public class PackageInfo
{
    // Registration Package information
    public DataPackage package { get; set; }
    public Reviewer reviewer { get; set; }
    public PackageTracking trackingSave { get; set; }

    <...>

    //Constructor
    public PackageInfo()
    {
        package = new DataPackage();
        reviewer = new Reviewer();
        trackingSave = new PackageTracking();
    }
}

したがって、そのためのすべての検証は「うまく機能します」。ビュー (実際には部分ビューの一部) に、"TextBoxFor" を配置しました。検証が失敗した場合は、素敵なエラー メッセージが赤字で表示されます。

意見:

@Html.TextBoxFor(model => Model.package.DataPackageID, new { @class = "short", @id = "DataPackageID" })
@Html.ValidationMessageFor(model => Model.package.DataPackageID, "The Data Package ID is required and cannot be longer than 50 characters")

問題

私が抱えている問題は、プログラムのレポート機能に移行したことです。「DateIn」および「DateOut」フォームの値を (とりわけ) 渡すことができる新しい ViewModel が必要なので、カスタム レポート クエリを実行できます。生成されます。DateIn と DateOut の値が実際に日付値であることを検証できるようにしたいと考えています。何らかの理由で、これは機能しません。

ビューモデル:

public class PackageVals
{
    < ... >

    // Date value for formatted "Date In" value
    [DataType(DataType.Date)]
    [DisplayName("Date In")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
    [Required]
    public DateTime DateIn { get; set; }

    // Date value for formatted "Date Out" value
    [DataType(DataType.Date)]
    [DisplayName("Date Out")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
    [Required]
    public DateTime DateOut { get; set; }

    <... more stuff ...>
}

意見

@Html.TextBoxFor(model => Model.DateIn, new { @class = "small", @id = "DateIn"})
@Html.ValidationMessageFor(model => Model.DateIn, "A valid date must be entered in the format mm/dd/yyyy.")
<...>
@Html.TextBoxFor(model => Model.DateOut, new { @class = "small", @id = "DateOut"})
@Html.ValidationMessageFor(model => Model.DateOut, , "A valid date must be entered in the format mm/dd/yyyy.")

すべての場合において、他のビューに埋め込まれた部分ビューを使用していることに注意してください。アプリのレポート生成セクションにはいくつかの異なるビューがあり、ほとんどすべてのビューで "DateIn" および "DateOut" フォーム値が必要です。

私は見るものを使い果たしており、それらを調べる時間もありません。現在、コントローラーで不適切な日付値をエラートラップし、null ViewModel を返して、ユーザーに黄色の死の画面が表示されないようにしています。 .

検証がjQueryに基づいていることは知っていますが、問題を引き起こす可能性のあることは何もしていないと思います. これが私のjQueryスクリプト全体です。

jQuery スクリプト

$(document).ready(function () {
    // Purple box autocomplete Stuff
    $("#Product").autocomplete({ source: '/SharedFunctions/AutoFillProduct' });
    $("#ActiveIngredient").autocomplete({ source: '/SharedFunctions/AutoFillActiveIngredient' });
    $("#Applicant").autocomplete({ source: '/SharedFunctions/AutoFillApplicant' });

    // Purple box autocomplete Stuff
    $("#DataType").autocomplete({ source: '/SharedFunctions/AutoFillDataType' });

    // Purple Box datepicker stuff
    $("#DateReceived").datepicker({ dateFormat: "mm/dd/yy" });
    $("#OutDate").datepicker({ dateFormat: "mm/dd/yy" });

    // Silver box datepicker stuff; Also used by Reports
    $("#DateIn").datepicker({ dateFormat: "mm/dd/yy" });
    $("#DateOut").datepicker({ dateFormat: "mm/dd/yy" });

    // Alternate table row colors
    $("table.center > tbody tr:even").css("background-color", "#F2F8FF");
});

これを理解するためにあなたが私に与えることができるどんな助けも素晴らしいでしょう. 他に必要なものがあれば教えてください。

再度、感謝します。

追加情報

混乱が生じた場合に備えて、明確にしたかったのです。2 つの ViewModel があります。最初の ViewModel (PackageInfo と呼ばれる) には、Entity Framework モデルから作成されたオブジェクトのインスタンスが含まれています。PackageInfo の値は、組み込みの「単純な」MVC 検証によってビューで適切に検証されています。

2 番目の ViewModel (PackageVals と呼ばれる) には、DateTime 値が含まれています。PackageVals の値は、ビューで検証されていません。

4

2 に答える 2

0

DateTime 値を Nullable にします。それらを必須にする必要がある場合は、必須属性があることを確認してください。

オブジェクトを null 許容できない場合は、データ モデルとは別のビュー モデルが必要です。ViewModel を使用すると、データ モデルのニーズに関係なく、ビューのニーズに合わせてカスタマイズできます。

于 2012-05-23T21:19:48.643 に答える
0

問題は、私が上に投稿しなかった唯一のコードであるコントローラーにありました。最初にそれを投稿していたら、@Mystere Man や、私を助けようとしてくれた親切な人たちがすぐにそれを拾ったと思います。

何が起こっていたのかというと、コントローラー関数の引数をモデル変数ではなく FormCollection 変数にしたため、モデルの検証に対してチェックされることなくデータが渡されていました。

動作するコードは次のとおりです。

    [HttpPost]
    public ActionResult RptPkgsRecd(PackageVals model)
    {
        ViewBag.CurrentPage = "reports";
        try
        {
            if (ModelState.IsValid)
            {
                PackageVals pv = new PackageVals();
                pv.dps = regpacksRepository.GetSubmitted(model.datePass.DateIn, model.datePass.DateOut).ToList();
                return View(pv);
            }
            else
            {
                PackageVals pv = null;
                return View(pv);
            }
        }
        catch(SystemException ex)
        {
            var error = ex.ToString();
            this.ModelState.AddModelError(error, ex);
            PackageVals pv = null;
            return View(pv);
        }
    }
于 2012-05-24T16:28:44.050 に答える