一般return view,會使用下列寫法
public IActionResult Index()
{
return View();
}
我想問說,能不能改成,當我點選
假設:CreateForm按鈕時,
到資料庫獲取 Url:"Project/CreateForm",
然後依照該網址直接return 到Views底下的Project資料夾中的CreateForm.cshtml?
我目前寫法是可以返回網址
https://localhost:7088/Project/FormCreate
但是進入網址會返回找不到該網頁。
會強迫寫IActionResult FormCreate才可以顯示
public IActionResult FormCreate(string formId)
{
return View();
}
JS:
$("#itemList").on("click", ".createForm", function () {
var itemValue = "製作表單";
$.ajax({
url: '/Project/GetViewUrl',
type: 'POST',
data: { itemValue: itemValue },
success: function (response) {
// 獲取返回的URL
var url = response.url;
// 重定向到該URL
window.location.href = url;
},
error: function () {
alert('無法獲取URL');
}
});
Controller:
會獲取到"/Project/FormCreate"
[HttpPost]
public IActionResult GetViewUrl(string itemValue)
{
DbManager dbManager = new DbManager();
string url = dbManager.GetUrlFromDatabase(itemValue);
return Json(new { url = url }); // 返回JSON格式
}
我有點霧煞煞,看不出你的問題點在哪兒
你的
return 到Views底下的Project資料夾中的CreateForm.cshtml?
但返回網址卻是寫
https://localhost:7088/Project/FormCreate
所以你實際ProjectController裡面到底有FormCreate還是CreateForm?
View裡面又有哪些?
撇開上面問題
你在MVC下
要取得AAA/BBB.cshtml
即便你的View/AAA/BBB.cshtml是存在的
你在AAAController裡面 也必須要有
public IActionResult BBB()
{
return View();
}
我的最終目標是希望,用一個controller到DB中獲取到view的位置。
根據該位置直接return view。
不想要每新增一個cshtml,就寫一個action去return view
但是現在寫法會變成,我可以獲取到網址,
但是我還是得寫一個
public IActionResult FormCreate(string formId)
{
return View();
}
沒有寫的話,網址會返回找不到頁面。
所以你有看到我最後寫什麼嗎?
MVC架構在大部分狀態下,View就是對應一個Controller裡面的Action,大致上只有PartialView或Component之類的才不需要增加Action對應。
至少我沒有運用過任何...不需要Action的View...除了上述特例以外..
去改 route,在 default route 前面多增加這一段,這個目的是把所有controller名字叫 project,底下的 actione 都攔截起來丟到 FormCreate 這個 Action
routes.MapRoute(
"ProjectRoute", // Route name
"Project/{action}/{id}", // URL with parameters
new { controller = "Project", action = "FormCreate", id = "" } // Parameter defaults
);
攔截進來之後,再用 var route = Request.Path.Value 之類的方式,取得使用者輸入的網址
另外友善提醒,不要相信任何從client端輸入的東西,包括網址列和request參數名稱 或值,這些東西沒過濾直接送往 db 的話會很精彩
其他 route 的參考資料