0

モデルに次のコードがあります。

public class ContactDaySelectorAttribute : SelectorAttribute
{
    public override IEnumerable<SelectListItem> GetItems()
    {
        var contactDay = new List<ContactDay> 
        { 
            new ContactDay {Id = 1, Name = "Monday"},
            new ContactDay {Id = 2, Name = "Tuesday"},
            new ContactDay {Id = 3, Name = "Wednesday"},
            new ContactDay {Id = 4, Name = "Thursday"},
            new ContactDay {Id = 5, Name = "Friday"},
            new ContactDay {Id = 6, Name = "Saturday"},
        };
        return contactDay.ToSelectList(m => m.Id, m => m.Name);
    }
}
//
public class ContactDay
{
    public int Id { get; set; }
    public string Name { get; set; }
}
//
[ContactDaySelector]
public virtual int? ContactDayCheckBox { get; set; }
//
[ContactDaySelector]
[ReadOnly(true)]
public string ContactDayCheckBoxPost
{
    get { return ContactDayCheckBox.ToString(); }
}

私はデータベースに値ContactDayCheckBoxを保存するために使用します。選択した項目(チェックボックス)を確認ビューに表示するためint?に使用します。ContactDayCheckBoxPost

ビューでこれを@Html.EditorFor(m => m.ContactDayCheckBoxPost)行い、ユーザーが以前に1日以上を選択した場合(たとえば)、1日の「名前」のみが表示されます(つまり、月曜日、火曜日が以前に選択された場合、ビューには「月曜日」のみが表示されます) )。

以前に選択したすべての選択肢を表示するビューを取得するにはどうすればよいですか?試し@foreachましたが、では機能しません。選択肢の間にコンマを挿入するintループのバリエーションを試し.Split(',')ましたが、実際に得られるのは実際の「Id」値(たとえば、「Monday」の代わりに「1」)だけです。 "月曜日")。

前もって感謝します。

4

2 に答える 2

0

ContactDayCheckBoxPost文字列として定義されます。ビューに渡す前に、この文字列に何を入力しますか?

場合によっては、次のように値を渡していると言う場合

ContactDayCheckBoxPost = "1, 2, 3, 4";

次に、そのような場合、Split(',')関数を適用し、これらのIDのリストを文字列として取得できます。次に、foreachを使用してIDを取得できます。

また、あなたがあなたの見解で何を使用しているのかを教えてください。あなたがここで何を求めているのか理解するのは少し難しいと思いました。

于 2012-12-09T16:48:43.993 に答える
0

問題(私が見ているように):

あなたが抱えている問題はSelectList「キー/値」のペアだと思いますが、「キー」を「値」として使用しようとしています。したがって、値が「1」のキー「Monday」の場合、1 が期待される値になります。例についてはhttp://codeclimber.net.nz/archive/2009/08/10/how-to-create-a-dropdownlist-with-asp.net-mvc.aspxhttp://msdn.microsoftを参照してください。の定義については、com/en-us/library/system.web.mvc.selectlistitem(v=vs.108).aspxSelectListItemを参照してください。

これを行う簡単な方法が必要な場合は、おそらく次を使用できます。

return contactDay.ToSelectList(m => m.Name, m => m.Name); //Both the key and the value are Name

ContactDaySelectorただし、 null 可能な int が必要なため、これは失敗します。

[ContactDaySelector]
public virtual int? ContactDayCheckBox { get; set; }

それは理にかなっていますか?

このアプローチを使用する場合は、クラスを使用し、[HttpPost] アクションで値「1」のルックアップを実行して「Monday」を見つけます。このメモでは、なぜこれを文字列として取得する必要があるのでしょうか (以下で推定します)。

解決策(私が見ているように):

より良い解決策は、曜日の列挙型を作成することです (実際には、列挙型のヘルプ ページに曜日の例が示されています - http://msdn.microsoft.com/en-us/library/sbbt4032(v =vs.80).aspxであり、組み込みの列挙型でもありますhttp://msdn.microsoft.com/en-us/library/system.dayofweek.aspx )。次に、これをアプリケーション全体で (コントローラーの [HttpPost] アクションなどで) 使用して、これを数値 (例: ) として設定(int)Days.Sunしますが、キーワード値 (例: ) を取得できるようにしますDays.Sun.ToString();。列挙型を使用する例については、http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspxを参照してください。ドロップダウン リスト。

曜日を文字列として扱う必要がある場合、曜日のクラスを作成する必要はないと思います。文字列と同じキーと値を選択しようとしているので、ViewBag/ViewModel に文字列のリストを追加してみませんか?

List<String> daysOfTheWeek = new List<String>() { "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun" };
ViewBag.DaysOfTheWeek = daysOfTheWeek;

Model または ViewModel に「WeekDay」というプロパティを設定します。

public string WeekDay { get; set; }

次に、それを使用して、次のように文字列プロパティを設定できます。

@Html.DropDownListFor(model => model.WeekDay, new SelectList(ViewBag.DaysOfTheWeek))

注: このアプローチでは編集 ViewModel を実際に定義する必要がありますが、ViewBag はデバッグ目的には問題ありません。

于 2012-12-10T02:58:06.997 に答える