2016-09-22 16 views
1

ASP.NET MVCコアプロジェクトの次のコードでは、GetアクションメソッドTest(...)に年のドロップダウンリストが表示されています。デフォルトでは、リストの最初の年(つまり2000)がSelected valueとして表示されます。選択した値と同じリストに特定の年を表示したい場合、どのように達成できますか?from action methodTest(...) ViewModel techinqueを使用しないでください。選択タグヘルパーまたはDropdownList HTMLヘルパーのいずれかの解決策は問題ありませんが、選択された値はアクションメソッドから設定する必要があります。 ViewBag.YearsList = Enumerable.Range(2000, 15).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList();ASP.NET CORE MVC selectタグヘルパー - ModelViewを使用せずに選択した値を設定する方法

モデル

public class BloggingContext : DbContext 
    { 
     public BloggingContext(DbContextOptions<BloggingContext> options) 
      : base(options) 
     { } 

     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<Post> Posts { get; set; } 
    } 

    public class Blog 
    { 
     public int BlogId { get; set; } 
     public string Url { get; set; } 

     public IList<Post> Posts { get; set; } 
    } 

    public class Post 
    { 
     public int PostId { get; set; } 
     public string Title { get; set; } 
     public string Content { get; set; } 
     public int PostYear { get; set; } 
     public int BlogId { get; set; } 
     public Blog Blog { get; set; } 
} 

コントローラー:のみ関連するアクションメソッドが示されているが、あなたがこのリストで選択した値として、特定の年を設定する方法を短いで

、 。

public class BlogsController : Controller 
{ 
    private readonly BloggingContext _context; 

    public BlogsController(BloggingContext context) 
    { 
     _context = context;  
    } 

    // GET: Blogs 
    public async Task<IActionResult> Index() 
    { 
     return View(_context.Blogs.ToList()); 
    } 

    // GET: /Blogs/Test 
    [HttpGet] 
    public async Task<IActionResult> Test(string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 
     ViewBag.YearsList = Enumerable.Range(2000, 15).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList(); 

     //return View(await _context.Blogs.Include(p => p.Posts).ToListAsync()); 
     var qrVM = from b in _context.Blogs 
        join p in _context.Posts on b.BlogId equals p.BlogId into bp 
        from c in bp.DefaultIfEmpty() 
        select new BlogsWithRelatedPostsViewModel { BlogID = b.BlogId, PostID = (c == null ? 0 : c.PostId), Url = b.Url, Title = (c == null ? string.Empty : c.Title), Content = (c == null ? string.Empty : c.Content) }; 

     return View(await qrVM.ToListAsync()); 
    } 

    // POST: /Blogs/Test 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Test(IList<BlogsWithRelatedPostsViewModel> model, string GO, int currentlySelectedIndex, string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 
     ViewBag.YearsList = Enumerable.Range(2000, 15).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList(); 

     if (!string.IsNullOrEmpty(GO)) 
     { 
      var qrVM = from b in _context.Blogs 
         join p in _context.Posts on b.BlogId equals p.BlogId into bp 
         from c in bp.DefaultIfEmpty() 
         where c == null? true : c.PostYear.Equals(currentlySelectedIndex) 
         select new BlogsWithRelatedPostsViewModel { BlogID = b.BlogId, PostID = (c == null ? 0 : c.PostId), Url = b.Url, Title = (c == null ? string.Empty : c.Title), Content = (c == null ? string.Empty : c.Content) }; 
      return View(await qrVM.ToListAsync()); 
     } 
     else if (ModelState.IsValid) 
     { 
      foreach (var item in model) 
      { 
       var oPost = _context.Posts.Where(r => r.PostId.Equals(item.PostID)).FirstOrDefault(); 
       if (oPost != null) 
       { 
        oPost.Title = item.Title; 
        oPost.Content = item.Content; 
        oPost.PostYear = currentlySelectedIndex; 
        oPost.BlogId = item.BlogID; //according to new post below the blogId should exist for a newly created port - but just in case 
       } 
       else 
       { 
        if (item.PostID == 0) 
        { 
         Post oPostNew = new Post { BlogId = item.BlogID, Title = item.Title, Content = item.Content, PostYear = currentlySelectedIndex }; //need to use currentlySelectedIndex intead of item.FiscalYear in case of adding a record 
         _context.Add(oPostNew); 
        } 

       } 
      } 
      await _context.SaveChangesAsync(); 
      //return RedirectToLocal(returnUrl); 
      return View(model); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(); 
    } 
} 

Test.cshtmlビュー

@model IList<ASP_Core_Blogs.Models.BlogPostViewModels.BlogsWithRelatedPostsViewModel> 

<div class="row"> 
    <div class="col-md-12"> 
     <form asp-controller="Blogs" asp-action="Test" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post"> 
      @{ 
       IEnumerable<SelectListItem> yearsList = (IEnumerable<SelectListItem>)ViewBag.YearsList; 
       var currentlySelectedIndex = 0; // Currently selected index (usually will come from model) 
      } 
      <strong>Select a Post Year</strong> 
      <h6>Choose a year and a URL to begin:</h6> 
      <label>Year:</label><select asp-for="@currentlySelectedIndex" asp-items="yearsList"></select><input type="submit" class="btn btn-default" name="GO" value="GO" /> 
      <table class="table"> 
       <thead> 
        <tr> 
         <th></th> 
         <th></th> 
         <th>Url</th> 
         <th>Title</th> 
         <th>Content</th> 
        </tr> 
       </thead> 
       <tbody> 
        @for (int i=0; i< Model.Count(); i++) 
        { 
         <tr> 
          <td>@Html.HiddenFor(r => r[i].BlogID)</td> 
          <td>@Html.HiddenFor(r => r[i].PostID)</td> 
          <td> 
           @Html.TextBoxFor(r => r[i].Url) 
          </td> 
          <td> 
           @Html.TextBoxFor(r => r[i].Title) 
          </td> 
          <td> 
           @Html.TextBoxFor(r => r[i].Content) 
          </td> 
         </tr> 
        } 
       </tbody> 
      </table> 
      <button type="submit" class="btn btn-default">Save</button> 
     </form> 
    </div> 
</div> 

答えて

0

あなたが項目にあなたが(LINQ、インデックスたい任意の方法を得ることができ、この宣言リストと、ある特定の項目の設定選択された値を解決することができ、等)。

サンプルコード:

var list = Enumerable.Range(2000, 15).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList(); 

// Select the item using index reference, this line selects '2010' item 
list[10].Selected = true; 

ViewBag.YearsList = list; 
+0

私は私のビューに 'GO'ボタンをクリックしたときに、' ViewBag.YearsList'が選択された値を変更しませんでした。たとえば、テストでは、2005年をドロップダウンから選択し、ビューによって送信されたモデルが投稿されたときに「移動」ボタンをクリックしたとき、POSTアクションで設定された2010ではなく、選択された値として2005が表示されましたメソッド 'Test(...) ' – nam

+0

選択した年をURLパラメータyの戻り値でViewBag経由で送ることができます –

0

ビューモデルを使用しないようにしたいので、あなたがDropDownListForを使用することはできませんが、あなたがDropDownList

@Html.DropDownList("fieldname", new SelectList(ViewBag.YearsList, ViewBag.SelectedYear)) 
0

を使用することができますあなたには選択した値を設定することができますアクションメソッドは次のようになります。

ViewBag.YearsList = Enumerable.Range(2000, 15) 
    .Select(g => new SelectListItem 
    { 
     Value = g.ToString(), 
     Text = g.ToString(), 
     Selected = (g == currentlySelectedIndex) 
    }).ToList(); 

あなたがモデルに結合されていない場合にのみ動作します。あなたの提案を使用して

<select name="selectedYear" asp-items="yearsList"></select> 
関連する問題