PDA

View Full Version : سوال: تنظیم action برای Form با کد نویسی ؟؟



chaalesh
شنبه 28 اردیبهشت 1387, 18:43 عصر
دوستان کسی در مورد تنظیم خاصیت action برای form با کد نویسی چیزی میدونه ؟
کد روبرو اجرا میکنه ولی توی سورس صفحه که میبینی دوباره ماله خودشو زده

this.form1.Attributes["action"] = "other.aspx";

برای رفع ایراد postback توی url rewritting میخوام کسی اگه راه حل دیگه ای هم داره بگه.
قبلا از آقای راد یه چیزی توی همین سایت در همین باره دیده بودم ولی خودمو کشتم پیداش نکردم

Behrouz_Rad
یک شنبه 29 اردیبهشت 1387, 00:26 صبح
یک کلاس از HtmlForm به ارث ببر و روال RenderAttributes اش رو Override کن.
در این روال باید خاصیت action رو حذف کنی.
اسمبلی ایجاد شده رو با دایرکتیو Register به صفحه معرفی کن و تگ form پیش فرض رو حذف و از تگ form خودت استفاده کن.

راه دیگه هم استفاده از ControlAdapters هست که از ControlAdpater به ارث می بری و از طریق یک فایل browser به کنترلی که دوست داری رفتارش رو Override کنی نسبت میدی.

موفق باشید.

chaalesh
یک شنبه 29 اردیبهشت 1387, 16:07 عصر
با تشکر دوباره
آقای راد من یک کلاس ساختم
از HtmlForm ارث بردم
متد RenderAttributes رو به شکل زیر Override کردم

writer.WriteAttribute("name", this.Name);
writer.WriteAttribute("method", this.Method);
writer.WriteAttribute("action", this.ResolveUrl(this.Action), true);

this.Attributes.Remove("name");
this.Attributes.Remove("method");
this.Attributes.Remove("action");

string submitEvent = this.Page_ClientOnSubmitEvent;

if (submitEvent != null && submitEvent.Length > 0) {
if (this.Attributes["onsubmit"] != null) {
submitEvent = submitEvent + this.Attributes["onsubmit"];
this.Attributes.Remove("onsubmit");
}
writer.WriteAttribute("language", "javascript");
writer.WriteAttribute("onsubmit", submitEvent);
}
writer.WriteAttribute("id", this.ClientID);

this.ViewState.Remove("innerhtml");
this.Attributes.Render(writer);
}

البته این کدها رو هم از جائی که نمونه این کارو کرده بود برداشتم و در ادامه این کلاس بعد از تعریف تابع بالا نوشتم


[
Description("Gets or sets the target url of the form post.Leave blank to postback to the same page."),
Category("Behavior"),
DesignerSerializationVisibility(DesignerSerializat ionVisibility.Hidden),
]
public virtual String Action {
get {
Object savedState = this.ViewState["Action"];
if ( savedState != null ) {
return (String)savedState;
}
return this.GetBaseObjectActionAttribute();
}
set {
this.ViewState["Action"] = value;
}
}
private String GetBaseObjectActionAttribute() {

Type form = typeof(System.Web.UI.HtmlControls.HtmlForm);
MethodInfo actionMethod = form.GetMethod("GetActionAttribute", BindingFlags.Instance | BindingFlags.NonPublic );
Object res = actionMethod.Invoke(this,null);//Invoke that method and get the value
return (String)res;
}
private String Page_ClientOnSubmitEvent {

get {
return (String)GetHideProperty( this.Page, typeof(System.Web.UI.Page), "ClientOnSubmitEvent" );
}

}
private Object GetHideProperty(Object target, Type targetType, String propertyName )
{
PropertyInfo property = targetType.GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.NonPublic );
if ( property != null ) {
return property.GetValue(target, null); }
else {
return null; }
}
اسمبلی ساخته شده را در صفحه استفاده کرده و سپس form خودمو پاک کردم و از این فرم استفاده کردم ایراد نمی آره ولی Action سرجاشه !!
ممنون میشم یه کمی ریزتر بگید ببینم کجای کار رو اشتباه رفتم

Behrouz_Rad
یک شنبه 29 اردیبهشت 1387, 17:11 عصر
من نمی دونم اون کدهایی که گذاشتی رو کی نوشته اما هر کی هست کمی قضیه رو سخت گرفته!
ضمن اینکه اون فرد، تگ action رو حذف نکرده!
با دستور ذیل اون رو مجددا به شکل دیگه ای ایجاد کرده!:


writer.WriteAttribute("action", this.ResolveUrl(this.Action), true);

من معمولا کد نمیدم و بیشتر سعی می کنم توضیح بدم تا خود فرد کد رو بنویسه ولی این دفعه رو بی خیال ;)


public class Form : System.Web.UI.HtmlControls.HtmlForm
{
protected override void RenderAttributes(HtmlTextWriter writer)
{
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");

writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");

this.Attributes.Render(writer);

base.Attributes.Remove("action");

if (base.ID != null)
writer.WriteAttribute("id", base.ClientID);
}
}

موفق باشید.

chaalesh
پنج شنبه 02 خرداد 1387, 00:17 صبح
استاد راد متشکرم
بالاخره بعد از 5 روز آزمون و خطا این مشکل بزرگ را حل کردم.
مرسی

b581102
دوشنبه 20 خرداد 1387, 11:41 صبح
ببخشيد آقای راد ، چطوری تو کد صفحه Register کنم ؟
روش زير درسته ؟



<%@ Register TagPrefix="frm" TagName="myform" Src="~/App_Code/Form.cs" %>

b581102
دوشنبه 20 خرداد 1387, 12:49 عصر
من برای کلاسم يه namespace تعريف کردم به نام ufurl و در کد صفحه نوشتم :

<%@ Register TagPrefix="tst" Namespace="ufurl" Assembly="ufurl" %>


حالا مشکلی که دارم اينه که موقع کامپايل خطا می ده که اسمبلی ufurl رو نمی شناسه

Behrouz_Rad
دوشنبه 20 خرداد 1387, 13:43 عصر
سینتکس آخری درسته.
این جور مواقع یا پروژه را Class Library در نظر بگیر یا نهایتاً از vbc.exe یا csc.exe برای کامپایل کلاس استفاده کن و پوشه ی bin رو دستی ایجاد کن و dll حاصل رو در اون قرار بده.

موفق باشید.

babakj
شنبه 22 تیر 1387, 23:12 عصر
این کدی که نوشتی ماله MSDN است و آقای Scott Mitchell هم نوشته


http://msdn2.microsoft.com/en-us/library/ms972974.aspx


لطفا منبع رو ذکر کنید