ASP.NET KERN MVC-wählen Sie tag-Helfer - wie man ausgewählten Wert ohne Verwendung ModelView -
In den folgenden code ein ASP.NET MVC-Kern-Projekt, die Aktion zu Erhalten Methode Test(...)
zeigt eine dropdown-Liste von Jahren. Standardmäßig ist das dropdown-zeigt das erste Jahr in der Liste (D. H. 2000)Selected value
. Wenn ich will, um die Anzeige eines bestimmten Jahres in der Liste ausgewählten Wert, wie kann ich es erreichen from action method
Test(...)
ohne mit ViewModel-techinque? Eine Lösung für entweder eine select-tag-Helfer oder ein DropdownList-html-Hilfsfunktion wird in Ordnung sein - aber Ausgewählten Wert hat, von action-Methode.
In kurzen, wie würden Sie ein bestimmtes Jahr als Gewählte Wert in dieser Liste: ViewBag.YearsList = Enumerable.Range(2000, 15).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList();
Modelle:
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; }
}
Controller: Nur relevant, action-Methoden angezeigt.
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-Ansicht
@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>
InformationsquelleAutor nam | 2016-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie vermeiden wollen, mit einem Blick Modell, Sie können nicht
DropDownListFor
aber Sie könnenDropDownList
InformationsquelleAutor Khyron
Können Sie den gewählten Wert in der action-Methode wie folgt:
Funktioniert dies nur, wenn Sie nicht die Bindung an ein Modell:
InformationsquelleAutor Ruard van Elburg
Lösen können Sie diese deklarieren Liste aus, und legen Ausgewählte Wert für einen bestimmten Artikel können Sie die Artikel ein, wie Sie wollen (linq, index, etc).
Beispielcode:
ViewBag.YearsList
nicht ändern Sie den ausgewählten Wert, wenn ich klickte auf dieGO
- Taste auf meiner Ansicht. Zum Beispiel, für einen test wählte ich das Jahr 2005 aus der Dropdownliste, und klicken auf dieGo
- Taste, wenn das Modell geschickt die Sicht gepostet wurde es noch angezeigt wird 2005 als gewählte Wert und nicht 2010, wurde in der POST-action-MethodeTest(...)
Sie können ausgewählte Jahr über url-parameter y Rückgabewert über ViewBag
InformationsquelleAutor H. Herzl