iT邦幫忙

0

關於ASP.NET MVC function的使用方式

  • 分享至 

  • xImage

小弟又來擾民了正所謂不懂就問
小弟之前原先是寫C# WinForm的也有玩過一下下MAUI
只是說現在突然要碰MVC就有個小問題

//之前在winform下在button裡面可以直接寫程式碼
public int i = 1;
public void fun()
    {
        i++;
    }
private void button1_Btn_Click(object sender, EventArgs e)
    {
        fun();
        label1.text = i.ToString();
        //label 顯示 2
    }

在MAUI也可以

<button @oncheck=""></button>

可是到了MVC後@oncheck就沒辦法使用fun()的這個function
既使在裡面寫了一樣不行使用fun這個功能

@{
    int i = 1;
    void fun()
    {
        i++;
    }
}

i++只是一個比喻
想請教該如何使用這項功能以及將其他的欄位變數帶進去
感謝

補充頁面是cshtml

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
poison3804
iT邦新手 4 級 ‧ 2022-12-15 10:29:18
最佳解答

從Webform換到MVC的時候,
其實整個思維架構都要重新理解過一次。
就我自己的理解,當你請求一個網址的時候,MVC會先經過你的Action,
然後才return view回去。
那你在view裡面寫的任何razor語法都是先在後端處理的,
全部處理完後才回傳到前端,
所以你寫的function,回傳到前端後就已經不存在了。(如有錯誤還請指教)
所以你之後想要再利用button呼叫那個function自然也就叫不到了。

如果是像這樣的function 最簡單的作法就是用直接用js去跑。
如果是很複雜的功能,就是用form直接去請求另一個action,
或是做一個api用非同步去呼叫json回來也行。

看更多先前的回應...收起先前的回應...

您好,非常感謝你的回答讓我我重新思考過他的架構差異
最終我使用了這個方法

onclick="location.href='@Url.Action("ActionName", "ControllerName")'"

可若是我的function裡面是

public void SQL(string SQLCommand)
{
    SqlConnection dataConnection = new SqlConnection();
    SqlCommand mySqlCmd = new SqlCommand(SQLCommand, dataConnection);
}

那我的應該怎麼把那串string帶入裡面
他似乎沒辦法使用

onclick="location.href='@Url.Action("SQL("string")", "ControllerName")'"

這樣的方法

科科 iT邦好手 8 級 ‧ 2022-12-15 13:53:39 檢舉

Url.Action 最終是產生一串網址來呼叫,
所以要帶參數可以使用以下方法

'@Url.Action("ActionName", "ControllerName", new {SQLCommand = xxx})'
'@Url.Action("ActionName", "ControllerName")' + '?SQLCommand=xxx'

科科
感謝回覆,我成功了,若是可以用回答的話可以幫您設成最佳回答,另外想再請教要怎麼將表格內的資料傳到要輸出的字串裡
概念大概是這樣

string send = SqlString+textbox.Text;

以及使用@Url.Action時能否讓它不要讓視窗前往網頁只要運行功能就好

Juro十六
如果要將後端的值傳到前端的話可以利用model,
return view的時候,把你的值或是物件傳回到前端,
我通常習慣每一頁都會建一個ViewModel的class

public ActionResult Index()
{
    ViewModel model = new ViewModel()
    {
        text = "something"
    };
    return View(model);
}

當你要使用回傳的值的時候就先在cshtml宣告model,
配合HtmlHelper就可以做資料綁定。

@model ViewModel

@Html.TextBoxFor(m => m.text)

第二點怕你有誤會,@Url.Action只是幫助你產生一串網址而已,造成postback的效果是location.href的關係,如果你是要做非同步的效果,應該要使用ajax等方法去呼叫action,讓action回傳json給前端處理才對。

科科 iT邦好手 8 級 ‧ 2022-12-15 21:59:54 檢舉

沒關係喔,最佳解答給別人就好~
另外你要的效果應該如上面的回答,用ajax處理。
比較沒有純前端經驗的可能需要慢慢學一下,
除了Razor語法之外,簡單的html5基礎,與ajax語法,
也可以學一下,這樣對頁面功能的思考會比較靈活~

0
allenlwh
iT邦高手 1 級 ‧ 2022-12-15 09:54:01

Index.cshtml

@{ 
    int i = 0, j = 0;
    i = 123;

    j = Calculate(i);
}

@functions{
    public int Calculate(int x) {
        int result;
        result = x * 2 + 5;

        return result;
    }
}

<div class="row">    
    <h2>
        i=@i
    </h2>
    <h2>
        j=@j
    </h2>
</div>
i=123
j=251

我是要button按下後執行,可能說明的不太清楚不好意思

感謝回覆

0
johncoc
iT邦新手 3 級 ‧ 2022-12-15 17:48:26

提供一個寫法(blazor測試可行)

無參數 => <button type="button" @onclick="@test1">
有參數 => <button type="button" @onclick="() => test2(a)">

@code{
    public async Task test1(){
        await func();
    }
    public async Task test2(a){
        await func(a);
    }
}

最後由於轉跳這塊真的對js不熟悉所以用了以下方法
1.轉跳至頁面

<button type="button" class="btn btn-primary" onclick="location.href='@Url.Action("SQL", "Home", new {SQLCommand = string1+"'"+list.list1+"'"})'">確認</button>

2.轉跳後執行SQLs的Function
3.直接轉跳回MIS頁面

public IActionResult MIS()
    => View();
public IActionResult SQL(string SQLCommand)
{
    SQLs(SQLCommand);
    return Redirect("MIS");
}
public void SQLs(string SQLCommand)
{
    SqlConnection dataConnection = new SqlConnection();
    SqlCommand mySqlCmd = new SqlCommand(SQLCommand, dataConnection);
}

雖然感覺挺不正規的
但至少解決了一個問題
至於要如何把或的文字與string1做結合還在思考

johncoc iT邦新手 3 級 ‧ 2022-12-16 18:09:24 檢舉

如果是剛做的專案
可以玩玩看blazor或是aspnet core web
可以學到一些DI的用法

我要發表回答

立即登入回答