請教各位先進二個問題..
1.我使用 Bootstrap Model 寫了一個 PartialView 並在其中寫了 JavaScript 當我驗證失敗反應原本的 PartialView 後 我所寫的 JavaScript 就無法執行了。但是當第一次顯示時是可以正常執行的。
我可以如何修正這個問題?
2.在 Bootstrap Model 中採用 ajax POST 到 Controller 其他類型的資料都沒有問題可以找得到值,但是只有 SelectListItem 的表單元件為Null
ajax
var PlaceHolderElement = $('#PlaceHolderHere');
PlaceHolderElement.on('click', '[data-save="modal"]', function (event) {
var form = $(this).parents('.modal').find('form');
var actionUrl = form.attr('action');
var sendData = new FormData(form.get(0));
console.log(sendData);
$.ajax({
url: actionUrl,
method: 'post',
data: sendData,
processData: false,
//contentType:"application/json; charset=utf-8",
contentType: false,
cache: false,
success: function (redata) {
if (redata.status === "success") {
//新增成功則關掉視窗
PlaceHolderElement.find('.modal').modal('hide');
//顯示資料成功新增的訊息
var notificationsPlaceholder = $('#notification');
var notificationsUrl = notificationsPlaceholder.data('url');
$.get(notificationsUrl).done(function (notifications) {
notificationsPlaceholder.html(notifications);
});
//自動關閉訊息
setTimeout(function () {
$(".alert").alert('close');
}, 3000);
//重析整理資料
//Click the query to use refresh to process the refresh parameters
$('#table').bootstrapTable('refresh');
}
else {
var newBody = $('.modal-body', redata);
PlaceHolderElement.find('.modal-body').replaceWith(newBody);
}
},
error: function (message) {
alert(message);
}
})
})
問題1--View
@model WebERP.Models.EIP.Roles
<!-- Modal -->
<div class="modal fade" id="AddEditRoles" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="AddEditRolesLabel">新增角色資料</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form asp-action="Create" id="Edit" enctype="multipart/form-data">
@Html.AntiForgeryToken()
<div asp-validation-summary="All" class="text-danger"></div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.ID)</span>
@if (Model.ID != null)
{
<input asp-for="ID" class="form-control" readonly />
}
else
{
<input asp-for="ID" class="form-control" autocomplete="off" />
}
<span asp-validation-for="ID" class="text-danger"></span>
</div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.Title)</span>
<input type="text" asp-for="Title" class="form-control" autocomplete="off" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.CompanyCode)</span>
<input type="text" asp-for="CompanyCode" class="form-control col-md-3" readonly>
<input type="text" id="CompanyName" class="form-control"
placeholder="請輸入統編或公司名關鍵字"
data-url="@Url.Action("GetCompanyByAutoComplete", "Company")"
autocomplete="off" />
<span asp-validation-for="CompanyCode" class="text-danger"></span>
</div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.BossID)</span>
<input type="text" asp-for="BossID" class="form-control col-md-3" readonly />
<input id="BossName" class="form-control" type="text"
placeholder="請輸入中文或英文名關鍵字。"
autocomplete="off" />
<span asp-validation-for="BossID" class="text-danger"></span>
</div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.DepartmentCode)</span>
<input type="text" asp-for="DepartmentCode" class="form-control col-md-3" readonly />
<input id="DepartmentName" class="form-control" type="text"
placeholder="請輸入代碼或部門名關鍵字。"
autocomplete="off" />
<span asp-validation-for="DepartmentCode" class="text-danger"></span>
</div>
<div class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.isVirtualGroup)</span>
<input asp-for="isVirtualGroup" class="form-control" autocomplete="off" />
<span asp-validation-for="isVirtualGroup" class="text-danger"></span>
</div>
<div id="GroupRoles" class="input-group">
<span class="input-group-text">@Html.DisplayNameFor(m => m.ListRoles)</span>
<button class="btn" type="button" id="AddRolesGroup">增加角色</button>
<button class="btn" type="button" id="Clear">清除所有</button>
<span asp-validation-for="ListRoles" class="text-danger"></span>
</div>
<div id="area">
<select id="EmpSelect" class="form-select col-md-12" size="8"
multiple aria-label="multiple select Employee">
<option selected>請選擇要放入選組的角色</option>
</select>
<button class="btn" type="button" id="ClearSelect">清除所選角色</button>
<select asp-for="ListRolesItem" class="form-select col-md-12" size="8"
multiple aria-label="ListRolesItem">
</select>
</div>
<div asp-validation-summary="All" class="text-danger"></div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" data-save="modal">Save changes</button>
</div>
</div>
</div>
</div>
<script src="~/bootstrap-autocomplete/dist/latest/bootstrap-autocomplete.min.js"></script>
$('#CompanyName').autoComplete({
minLength: 2,
formatResult: function (item) {
return {
value: item.value,
text: "[" + item.value + "] " + item.text,
/*html: "<h6 style=color:blue>" + item.value + "</h6> " + item.text*/
}
}
});
$('#CompanyName').on('autocomplete.select', function (evt, item) {
console.log(item);
$('#CompanyCode').val(item.value);
$('#CompanyName').val(item.text);
});
問題1、2--Controller
[HttpPost]
public async Task<IActionResult> CreateAsync(Roles roles)
{
if (ModelState.IsValid)
{
RolesService service = new();
Roles r = await service.GetCompanyRolesAsync(roles.CompanyCode,roles.ID);
if(r == null)
{
roles.Modifier = User.Identity.Name;
roles.ModifierTime = DateTime.Now;
if (await service.AddRolesDataAsync(roles))
{
Success("資料新增成功");
return Json(new { status = "success" });
}
else
{
ModelState.AddModelError("error", "新增資料失敗");
return View("_Edit", roles);
}
}
}
ModelState.AddModelError("error", "表單驗証錯誤");
return View("_Edit", roles);
}
問題2--Model
[ModelMetadataType(typeof(RolesMD))]
public partial class Roles
{
public IEnumerable<SelectListItem> ListRolesItem { get; set; }
}
問題1
問題2
第一個問題 程式不夠完整,上面有大大提醒了
第二個問題 Select的 Tag Helper 需要有 asp-for="" asp-items="",
這兩個,但我也不確定你有沒有,因為你提供的圖檔住一部分
您好.
沒有 asp-items 這個 Tag.
目前正在測試是否能把值接回來.
己把 asp-items 加到 View 中了..但是還是無法把資料接回 Controller 中....
我決定直接找官方範例給你
相關連結
您好。感謝提供。
我在您提到 asp-items 時有去看過..
也把他加進去了...
<div id="area">
<select id="EmpSelect" class="form-select col-md-12" size="8"
multiple aria-label="EmpSelect">
</select>
<button class="btn" type="button" id="ClearSelect">清除所選角色</button>
<select asp-for="RolesList" asp-items="@Model.RolesList" class="form-select col-md-12" size="8"
multiple aria-label="RolesList">
</select>
</div>
但是在使用 ajax 送出時卻沒有包含在內...目前不知道為什麼.
@@" 忘了拿掉...
拿掉後也有試過..也是沒有資料回傳.
Miels1122
給一個Name屬性呢?
有試過了...一樣取不到回傳的資料。
等會全部重寫試試.
如果不行就只能想其他的方式來取得我要的資料了
Select的範例 我簡單寫一下,看起來可以正常取值 你可以再研究一下
model
public class CountryViewModel
{
public string Country { get; set; }
public List<string> Countrys { get; set; }
public List<SelectListItem> Countries { get; set; }
}
cshtml
@model CountryViewModel
<form asp-controller="Home" asp-action="Index" method="post">
<select asp-for="Countrys" asp-items="Model.Countries" multiple></select>
<br />
<button type="submit">Register</button>
</form>
controller
public IActionResult Index()
{
var Countries = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico" },
new SelectListItem { Value = "CA", Text = "Canada" },
new SelectListItem { Value = "US", Text = "USA" },
};
var model = new CountryViewModel()
{
Countries = Countries,
Country = "CA",
};
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index(CountryViewModel model)
{
if (ModelState.IsValid)
{
var msg = model.Country + " selected";
return RedirectToAction("IndexSuccess", new { message = msg });
}
return View(model);
}
關於問題一的部分我有稍微看一下
首先是我看到你綁定事件是在 id:PlaceHolderHere這個element上,
但是我在你提供的相關的程式頁面找不到,所以我不清楚你那部分的情況,第二個部分是[HttpPost]CreateAsync這個裡面出現了兩種回傳型態,一下是view一下是json,第一次看到混搭的部分,簡單猜測一下有可能的問題是,事件綁定,因為你說第一次可以,第二次不行,你可以用Edge 偵錯模式確認一下事件綁定還存不存在,有可能因為return view 刷新html導致事件綁定失效,我說的綁定部分就是
var PlaceHolderElement = $('#PlaceHolderHere');
PlaceHolderElement.on('click', '[data-save="modal"]', function (event)
感謝您的耐心查看.
id:PlaceHolderHere這個element 在主畫面中,算是一個佔位的 Div 內容.
因為並沒有太多的程式碼...所以忘了放上來了..抱歉..內容如下<div id="PlaceHolderHere" data-url="@Url.Action("Create")"></div>
目前由於對 Partial View 還不是很了解.所以就按照我自己的需求看著硬作了.
感謝您提供的連結.
立馬來看看...
問題二
有確認過你的js中sendData內容嗎?
按你前端寫的post應該是沒啥問題,除非源頭sendData就不完整了
另外內容和標題有些錯誤
Bootstrap中使用的是Moda
l而非Mode
l哦
您好..標題的部分我會再注意...感謝.
另外...請教要如何查看 SendData 的內容?
我剛才使用 Edge 查看送出的內容時發現..並沒有包含我所需要的那個 欄位名稱...
這是我看到的畫面。就是找不到我所需要的 SelectListItem 元件的資料
是說,SelectList你要傳的是,所選值的內容? 還是整個List傳去POST~我不知道整個傳有什麼作用....
如果只是傳值,Model內的型別怎麼會是整個SelectListItem ? 應該只是值的型別,無論string或int等等...
感謝回答...
我的想法比較笨一點...
想由一個 SelectlistItem 由使用者進行選取..並將選好的值 Pass 給第二個 SelectListItem。並存放第二個的內容到 DB 中.
所以才會這樣做...不過今天又想想..可以不需要這樣來處理才對.就像您說的存值就好..
我不確定你這樣做是否可行,因我不認為前端這樣拋出去,後端會看得懂此型別。可試試單純傳值作法,然後兩個SelectListItem分別可改用後端Action,ViewBag回去取得。不過若你能成功傳SelectListItem也可再分享出來~ 剩下交給其他大大